클래스란 '객체를 정의해 놓은 것' 또는 '객체의 틀 또는 설계도'라고 정의하며 클래스에 선언하고 정의한 대로 객체를 생성하는 데 사용합니다.
객체와 인스턴스
객체는 실제로 존재하는 사물이나 개념을 의미하며 클래스에 정의된 내용을 기반으로 객체를 생성합니다. 이 과정을 인스턴스화라하며 메모리에 할당된 객체를 인스턴스라고 합니다.
클래스를 정의하는 방법
클래스를 선언할때는 class
키워드를 사용하여 정의하며 아래와 같이 선언합니다.
접근제어자 class 클래스이름 {
//필드, 메소드 등등
}
접근 제어자를 통해 외부에서 클래스에 접근할 수 있는지 제어를 할 수 있고 클래스의 이름은 파스칼 표기법을 따라 첫 문자는 대문자로 시작한다. 그리고 클래스 내부에 필드와 메소드등을 정의할 수 있으며 생성자의 경우는 선언하지 않는 경우 컴파일러가 자동으로 기본 생성자를 생성해준다.(생성자를 직접 선언 시 default 생성자는 선언되지 않음)
public class Car {
String name;
String color;
int cost;
public Car() {
}
public Car(String name, String color, int cost) {
this.name = name;
this.color = color;
this.cost = cost;
}
public String getName(){
return name;
}
public String getColor() {
return color;
}
}
객체를 만드는 방법
선언된 클래스를 통해 인스턴스를 생성할 수 있는데 이때 new
키워드를 사용합니다.
클래스 변수명; //선언
변수명 = new 클래스(); //객체 생성 후 객체의 주소를 변수에 저장
클래스 변수명 = new 클래스();
로 사용할 수 있으나 아래 그림의 이해를 위해 나누었습니다.
위에서 선언한 Car클래스를 인스턴스로 생성해봅시다.
Car myCar = new Car();
이 한 줄에서 많은 일들이 일어나게 되는데 Car클래스 타입의 참조변수 myCar를 선언하고 스택에 myCar를 위한 공간이 할당됩니다. 이후 new 키워드를 통해 Car클래스의 인스턴스가 heap 영억에 생성되고 멤버 변수의 자료형에 해당하는 기본값으로 초기화됩니다. (int형은 0, String은 참조형이여서 null)
메소드 정의하는 방법
메소드는 또한 크게 선언부와 구현부로 나눌 수 있으며 선언부에는 접근제어자, 반환타입, 메소드이름, 파라미터(필요한경우)로 구성되어 있으며 구현부는 중괄호 내에 메서드 호출시 수행할 코드들을 작성하면 됩니다.
접근제어자 반환타입 메소드이름(매개변수, ...) { //선언부
// 구현부
}
public String getName(){
return name;
}
처음 클래스를 선언할 때 사용하였던 getName()메소드를 보면 getName() Name을 얻는 메소드라는 것을 알 수 있고 public 접근제어자를 사용하여 어디에서나 접근 가능하며, 반환타입은 String으로 String형 name을 반환한다는 것을 알 수 있습니다.
생성자
생성자는 인스턴스가 생성될 때 호출되는 호출되는 초기화 메소드로 인스턴스 생성 시 실행해야 할 작업들을 위해 사용되며 다음과 같은 특징을 가집니다.
- 생성자는 반환 값이 없으며 void로 선언하지 않는다.
- 생성자의 이름은 클래스의 이름과 같으며 초기화를 위해 인수를 전달받을 수 있다.
- 클래스는 여러 개의 생성자를 가질 수 있다. (오버로딩이 가능하다)
- 클래스에 생성자를 선언하지 않으면 컴파일러가 기본 생성자를 추가해준다.
- 명시적으로 다른 생성자를 선언하였다면 기본 생성자가 생성되지 않으므로 사용하려면 선언해야 한다.
생성자를 선언하는 방법
클래스이름() {...} //매개변수가 없는 기본 생성자
클래스이름(매개변수,...) {...} // 매개변수가 있는 생성자
public class Car {
String name;
String color;
int cost;
public Car() { //매개변수가 없는 기본생성자
}
public Car(String name, String color, int cost) { // 매개변수가 있는 생성자.
this.name = name;
this.color = color;
this.cost = cost;
}
...
}
this(), this
this는 자주 사용되는 키워드로 자기 자신을 참조하는 데 사용하는 변수입니다. 3가지 형태로 사용하고 있습니다.
인스턴스 변수와 매개변수의 이름이 같을 때
생성자의 매개변수 이름과 인스턴스 변수의 이름이 같아 이를 구분하기 위해 this를 붙여 구분하였습니다.생성자에서 다른 생성자를 호출할 때
this()메소드는 생성자 내부에서 사용할 수 있으며 같은 클래스의 다른 생성자를 호출할 때 사용합니다.
생성자에서 다른 생성자를 호출할 때는 반드시 클래스의 이름이 아닌 this를 사용해야 하며 첫 줄에서만 호출이 가능합니다.객체 자신의 참조값을 전달할 때
객체 자신의 참조값을 전달하고 싶은 경우 this 키워드를 통해 가능합니다.
public class Car {
String name;
String color;
int cost;
public Car() {
this("부릉이","빨강색",2000); //2
}
public Car(String name, String color, int cost) {
this.name = name; //1
this.color = color;
this.cost = cost;
}
public Car getCarInstance(){
return this; //3
}
}
참고문서
Java의 정석 - 남궁 성
http://www.tcpschool.com/java/intro
'프로그래밍 > Java' 카테고리의 다른 글
상속 (0) | 2020.12.26 |
---|---|
JVM이란? (0) | 2020.12.22 |
java8 - time (0) | 2020.03.10 |
java8 - Optional (0) | 2020.02.23 |
java8 변경사항 - 스트림API 최종연산 (0) | 2020.02.07 |