클래스 정의하는 방법
Java에서 클래스를 정의하기 위해서는 Class 예약어를 사용한다.
키워드 뒤에는 클래스 이름이 와야 한다. 정의한 클래스 내에 메서드와 변수를 선언한다.
클래스 정의에는 다음과 같은 내용이 포함된다.
- modifier : public or default
- class keyword : class 키워드는 클래스를 생성하는데 사용된다.
- class name : 관례상 대문자로 시작하는 이름을 사용한다.
- superclass (있는 경우) : extends 키워드를 사용하여 클래스의 상위 클래스를 상속 받을 수 있다
- interface (있는 경우) : implements 키워드를 사용하여 인터페이스에 구현된 추상 메서드를 구현할 수 있다.
- body : 중괄호 { }로 클래스 본문의 범위를 지정한다.
Syntax
<access modifier> class class_name {
// member variables
// class methods
}
객체 만드는 방법 (new 키워드 이해하기)
클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 하며,
어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.
Hello h;
// 클래스명 참조변수
h = new Hello();
// new 예약어를 이용해 클래스 객체를 생성한 후 참조변수 h에 객체의 주소를 저장
- 객체를 생성하기 위해 클래스의 객체를 참조하기 위한 참조변수 선언
- 객체를 생성한 후, 객체의 주소를 참조 변수에 저장
new 예약어
- Java에서 new 예약어를 사용하여 클래스의 인스턴스가 메모리의 빈 공간에 생성된다.
- 객체가 생성되면 멤버변수는 각 자료형에 해당하는 기본 값으로 초기화됨
- new 예약어를 통해 객체를 여러 개 만들면 객체들은 각각의 별도의 객체가 생성된다.
- 생성된 객체는 속한 메서드의 실행이 끝나면 제거된다.
메서드 정의하는 방법
Java의 메서드는 특정 작업을 수행하고 호출자에게 결과를 반환하는 명령문의 모음이다.
메서드를 선언하는데에는 다음과 같은 구성 요소가 포함된다.
- modifier : 메서드의 액세스 유형을 지정해준다. 액세스 유형으로 메서드의 범위를 제한할 수 있다.
- default : 클래스가 정의된 동일한 클래스 및 패키지 내에서 액세스할 수 있다.
- private : 정의된 클래스 내에서만 액세스할 수 있다.
- protected : 정의된 클래스와 해당 하위 클래스에서만 액세스할 수 있다.
- public : 애플리케이션 모든 클래스에스 액세스할 수 있다.
- return type : 메서드에서 반환된 값의 데이터 유형을 지정한다. 값을 반환하지 않는 경우엔 void를 사용한다.
- method name : 소문자로 시작하는 이름을 사용한다.
- parameter list : 매개변수는 데이터 유형을 앞에 정의 하여 쉼표로 구분하여 정의한다. 매개변수가 없으면 빈 괄호 () 를 사용한다.
- exception list : 메서드 내부에서 예상되는 예외를 던져야할 경우가 있다. 이러한 예외를 지정할 수 있다.
- method body : 메서드의 본문은 중괄호로 묶는다. 메서드 내부에서 수행할 코드를 입력한다.
생성자 정의하는 방법
생성자는 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드이다.
인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시 실행되어야 할
작업을 위해도 사용된다.
생성자의 조건은 다음과 같다.
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴 값이 없다.
class Hello {
private String name;
private int count;
public Hello() {
// 매개변수가 없는 생성자
}
public Hello(String name, int count) {
this.name = name;
this.count = count;
// 매개변수가 있는 생성자
// 생성자의 매개변수를 통해 인스턴스 변수를 초기화해주었다.
}
}
인스턴스를 생성할 때는 반드시 클래스 내에 정의된 생성자 중 하나를 선택하여 지정해주어야 한다.
그렇기 때문에 모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 한다.
컴파일러는 기본 생성자를 제공해준다.
컴파일 할 때 소스파일(.java)의 클래스에 생성자가 하나도 정의되지 않은 경우
컴파일러는 자동적으로 아래와 같은 내용의 기본 생성자를 추가하여 컴파일 한다.
Hello() { }
- 컴파일러가 컴파일 시점에 자동으로 추가해주는 기본 생성자는 매개변수도 아무런 내용도 없는 그러한 생성자이다.
생성자에서 다른 생성자 호출하기
같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼
생성자 간에도 서로 호출이 가능하다
- 생성자의 이름으로 클래스 이름 대신 this를 사용한다.
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
이와 같은 두 조건을 만족시켜주어야 한다.
-> 매개변수가 없는 생성자를 통해 매개변수를 초기화 해주고 있다. (this 키워드 사용 X)
public class Car {
private String color;
private String gearType;
private int door;
public Car() {
color = "white";
gearType = "auto";
door = 4;
}
}
-> this 키워드를 이용하여 Car() 생성자에서 또 다른 생성자
Car(String color, String gearType, int door)를 호출하였다.
생성자 간 호출에는 이름 대신 this를 사용해야 한다.
public class Car {
private String color;
private String gearType;
private int door;
public Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
public Car() {
// 생성자 내부에서 또 다른 생성자를 호출하기 위해서는 첫 줄에서만 호출
this("white", "auto", 4);
}
}
this 키워드 이해하기
Java의 this는 인스턴스 메서드 혹은 생성자에서 현재 객체를 참조하고자 할 때 사용된다.
그 중 주로 아래의 세 가지 상황에서 사용된다.
- 객체 자신의 속성을 나타내고자 할 때
public class Hello {
private String name;
public Hello(String name) {
this.name = name;
}
}
생성자에 매개변수로 넘어온 name의 값을 현재 객체의 참조 변수에 할당하고자 할 때 현재 객체를 참조하고자하는 의도로 this 키워드가 사용된다.
2. 생성자 내부에서 다른 생성자를 호출하고자 할 때
public class Hello {
private String name;
private int age;
public Hello() {
this("hello", 10);
}
public Hello(String name, int age) {
this.name = name;
this.age = age;
}
}
아무 매개변수를 받지 않는 생성자를 호출했을 때 생성자 내부에서
name과 age를 매개변수로 받는 또 다른 생성자를 this 키워드를 이용하여 호출하였다.
이 경우 this 키워드는 생성자 내부 첫 줄에서 사용해야한다.
3. 객체 자신의 참조 값을 전달하고자 할 때
public class Hello {
private String name;
private int age;
public Hello(String name, int age) {
this.name = name;
this.age = age;
}
public Hello getHelloInstance() {
return this;
}
}
메서드에서 어떠한 동작을 수행하고 반환 값으로 현재 객체를
반환하고자 할 때 this 키워드를 사용할 수 있다.
이 외에 인스턴스 변수가 참조되고 있다는 사실을 명시하기 위해 사용할 수 있다.
https://www.javatpoint.com/class-definition-in-java
자바의 정석 6장
https://www.geeksforgeeks.org/methods-in-java/
https://stackoverflow.com/questions/2411270/when-should-i-use-this-in-a-class
https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html
'Java' 카테고리의 다른 글
Java Overriding (0) | 2022.08.30 |
---|---|
Java의 상속과 super 키워드 (0) | 2022.08.29 |
제어문 (0) | 2022.08.12 |
연산자 (0) | 2022.08.10 |
자바 데이터 타입, 변수 그리고 배열 (5) | 2022.07.28 |