생성자
생성자는 클래스에 선언되어있는 클래스와 동일한 이름을 가지고 있는 메소드이다.
생성자는 객체를 생성할때 호출된다.
생성자와 메소드의 형태 차이
메소드 | 생성자 | |
구현부 | return형 메소드명 (파라미터 1, 파라미터2,,,) | 클래스명(파라미터 1, 파라미터 2,,,) |
ex) | int Sum(int a, int b) | ClassName(int a, int b) |
이처럼 생성자는 리턴형을 사용하지 않으며 클래스와 동일한 이름을 가진다.
파라미터를 받아 멤버변수의 초기화를 위해 사용할 수 있으며 명시적으로 작성하지 않는다면 자동으로 기본생성자가 제공된다.
이렇게 기본으로 생성되는 생성자를을 디폴트 생성자라고도 부른다.
디폴트 생성자는 precompile 단계에서 추가가 된다.
만약 파라미터가 있는 생성자를 구현했다면 디폴트 생성자가 제공되지 않기 때문에 아래처럼 에러가 난다.
class Main{
public static void main(String[] args){
Const c = new Const(); // 에러
}
}
class Const{
int a;
Const(int a){ //파라미터가 있는 생성자
this.a = a;
}
}
따라서 명시적으로 기본 생성자를 추가로 작성해야한다.
이처럼 이름은 같지만 파라미터가 다른 메소드를 정의하는 것을 오버로딩(Overloading) 이라 한다.
아래 코드와 같이 여러개의 생성자를 추가할 수 있다.
class ClassName{
int a;
double b;
String c;
ClassName(){ //파라미터가 없는 생성자
}
ClassName(int a){
this.a = a;
}
ClassName(double b, String c){
this.b = b;
this.c = c;
}
}
정보은닉 (Information hiding)
정보은닉이란 객체지향의 특징 중 하나로 다른 객체에게 자신의 정보를 숨기기 위해 다른 클래스로부터의 접근을 막는 것이다.
캡슐화 vs 정보은닉
두 개념은 엄밀히 말하자면 다른 개념이다.
캡슐화는 객체의 속성과 메소드를 하나의 클래스로 묶어주며 필요한 기능만을 오픈하는 것이다.
사용자의 관점에서 일관된 기능을 사용할 수 있게하고 정보를 보호한다.
접근제어자 (access modifier)
접근제어자는 정보은닉을 위한 기능이라 할 수 있다.
접근제어자는 멤버변수와 메소드를 선언할 때 해당 변수와 메소드를 접근가능한 범위를 지정해준다.
접근 가능 범위 | |
public | 모든 접근을 허용 |
protected | 본인 클래스, 자식 클래스에서의 접근 허용 |
private | 본인 클래스 내부의 메서드만 접근 허용 |
default | 같은 패키지 내에서만 접근 허용, 생성자를 명시하지 않을때 자동 설정 |
이와 같은 접근제어자를 사용해 구현해보자
예를 들어 멤버변수에 직접 접근하지 못하게 정보은닉을 하려면 해당 변수를 pivate으로 선언한 뒤
해당 변수를 읽어오고 값을 접근할 수 있는 getter 와 setter 메소드를 public으로 선언을 한다.
class Main{
public static void Main(String[] arg){
Student std = new Student();
std.address; // error
std.getAddress();
std.setAddress("170");
}
}
class Student{
private int address;
public int getAddress() {
return address;
}
public void setAddress(int address) {
this.address = address;
}
}
public vs private
만약 public으로 멤버변수를 선언했다면 getter 와 setter 를 사용하지 않고도 직접 해당 값에 접근할 수 있게 되기 때문에 캡슐화 되지 못한다.
참조형 변수
참조형 변수는 C언어의 포인터와 같은 개념이다.
즉 주소값을 저장하고 있는 변수라는 뜻이다.
자바에서 참조형 변수를 선언할때는 new 문법을 사용해 생성자를 통해 선언한다.
this 예약어란?
생성된 인스턴스 스스로를 가리키는 예약어
같은 변수명이 있을때 해당 클래스의 멤버로 구분할 수 있게 해주어 private 으로 선언된 변수를 접근하여 초기화한다.
this 를 해당 클래스 명으로 치환한다고 보면된다.
또한 this로 생성자 내에서 다른 오버로딩된 생성자를 호출 할 수 있다.
이렇게 생성자 내에 생성자를 호출할때에는 this구문 위에는 그 어떤 statemant도 올 수 없다.
class Student{
private String name;
private int grade;
Student(String name){
//this.name = name; - error
// this 생성자 위에는 다른 어떤 statement도 오면 안된다
this(name, 100);
}
Student(String name, int grade){
this.name = name;
this.grade = grade;
}
}
'Language & Framework > Java' 카테고리의 다른 글
[JAVA] :: 자바 기초 4 :: 상속 / 오버라이딩(overriding) / IS-A vs HAS-A / 가상함수 (0) | 2021.07.19 |
---|---|
[JAVA] :: 자바 기초 3 :: Static / Singleton Patton / Array / ArrayList (0) | 2021.07.10 |
[JAVA] :: 자바 기초 1 :: 객체 / 클래스 / 인스턴스 / 속성 / 함수 / 메소드 (2) | 2021.07.04 |
[JAVA] 소켓(socket) 프로그래밍 (0) | 2021.01.20 |
[JAVA]입출력 IO & NIO (0) | 2021.01.20 |