목표
자바의 Class에 대해 학습하세요.
학습할 것 (필수)
- 클래스 정의하는 방법
- 객체 만드는 방법 (new 키워드 이해하기)
- 메서드 정의하는 방법
- 생성자 정의하는 방법
- this 키워드 이해하기
과제 (Optional)
- int 값을 가지고 있는 이진트리를 나타내는 Node라는 클래스를 정의하세요.
- int value, Node left, right를 가지고 있어야 합니다.
- BinrayTree라는 클래스를 정의하고 주어진 노드를 기준으로 출력하는 bfs(Node node)와 dfs(Node node) 메서드를 구현하세요.
- DFS는 왼쪽, 루트, 오른쪽 순으로 순회하세요.
1. 클래스 정의하는 방법
클래스를 알기 전에 객체(Object)에 대한 지식이 있어야 한다. 객체란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 다른 것과 식별 가능한 것을 의미한다. 예로는 물리적으로 존재하는 자동차, 자전거, 책, 사람과 추상적인 학과, 강의, 주문 등이 모두 객체가 될 수 있다.
사람을 예로 들면 이름, 나이 등의 속성과 웃는다, 걷다 등의 동작으로 구분될 수 있는데 이는 자바에서 사람 객체의 속성과 동작을 각각 필드(field)와 메서드(method)라 부르게 된다.
그리고 현실 세계의 이러한 객체를 소프트웨어 객체로 모델링하는 과정을 객체 모델링(Object Modeling)이라고 한다.
이러한 객체를 바탕으로 클래스(Class)에는 객체를 생성하기 위한 필드와 메서드가 정의되어 있다. 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(instance)라고 한다. 사람 객체는 사람 클래스의 하나의 인스턴스인 셈이다. 이렇게 클래스로부터 객체를 만드는 과정을 인스턴스화라고 한다. 하나의 클래스로부터 여러 개의 인스턴스를 만들 수 있다.
클래스를 선언하는 방법
클래스를 정의하기에 앞서 식별자 작성 규칙에 따라 정의를 해야 한다.
1 | 하나 이상의 문자로 이루어져야 한다. | Car, SportsCar |
2 | 첫 번째 글자는 숫자가 올 수 없다. | Car, 3Car(x) |
3 | '$','_' 외의 특수 문자는 사용할 수 없다. | $Car, _Car, @Car(x), #Car(x) |
4 | 자바 키워드는 사용할 수 없다. | int(x), for(x) |
클래스 이름을 정했으면 "클래스이름.java"로 소스 파일을 생성해야 한다.
public class 클래스이름{
}
앞에서 예를 들었던 사람 클래스를 만들어보자
public class Person{
}
일반적으로 소스 파일당 하나의 클래스를 선언하지만 두 개 이상의 클래스 선언도 가능하다.
public class Person{
}
class Run{
}
이와 같이 여러개의 클래스를 한 파일 안에 정의할 때 주의할 점은 파일 이름과 동일한 이름의 클래스 선언에만 public 접근 제한자를 붙일 수 있다.
2. 객체 만드는 방법 (new 키워드 이해하기)
클래스로부터 객체를 생성하는 방법은 new 연산자를 이용하는 방법이다.
new 클래스();
new는 클래스로부터 객체를 생성시키는 연산자이다. new 연산자 뒤에는 생성자가 오는데, 생성자는 클래스() 형태를 가지고 있다. new 연산자로 생성된 객체는 메모리 힙(heap) 영역에 생성된다.
그리고 heap 영역에 생성된 객체의 주소를 리턴하도록 되어 있다. 이 주소를 참조 타입인 클래스 변수에 저장해 두면 변수를 통해 객체 사용이 가능하다.
클래스 변수 = new 클래스();
클래스 내부는 필드, 생성자, 메서드로 구분된다.
public class Person{
// 필드 : 객체의 데이터가 저장되는 곳
int fieldName;
// 생성자 : 객체 생성 시 초기화 역할 담당
Person(){}
//메서드 : 객체의 동작에 해당하는 실행 블록
void methodName(){}
}
3. 메소드 정의하는 방법
메서드는 객체의 동작에 해당하는 중괄호 {} 블록이다. 중괄호 블록이 이름을 가지고 있고 이 메서드를 호출하게 되면 중괄호 블록 내의 코드들이 실행된다. 메서드는 필드를 읽고 수정하는 역할뿐 아니라 다른 객체를 생성하여 다양한 기능을 수행할 수 있다.
메서드는 객체 간의 데이터 전달의 수단으로 사용된다. 외부로부터 매개 값을 받을 수 있고, 실행 후 어떤 값을 리턴할 수도 있다.
4. 생성자 정의하는 방법
클래스를 가지고 객체를 생성하면, 해당 객체는 메모리 힙 영역에 즉시 생성된다. 하지만 이렇게 생성된 객체는 모든 인스턴스 변수가 아직 초기화되지 않은 상태이다. 자바에서 클래스 변수와 인스턴스 변수는 별도로 초기화하지 않으면, 다음 값으로 자동 초기화된다.
변수의 타입 | 초깃값 |
char | '\u0000' |
byte, short, int | 0 |
long | 0L |
float | 0.0F |
double | 0.0 또는 0.0D |
boolean | false |
배열, 인스턴스 등 | null |
생성자는 new 연산자로 호출되는 특별한 중괄호 {} 블록이다. 생성자의 역할은 객체 생성 시 초기화를 담당한다. 필드를 초기화하거나, 메서드를 호출해서 객체를 사용할 준비를 한다. 생성자는 메소드와 비슷하게 생겼지만, 클래스 이름으로 되어 있고 리턴 타입이 없다.
5. this 키워드 이해하기
this 참조 변수는 인스턴스가 바로 자기 자신을 참조하는 데 사용하는 변수입니다.
이러한 this 참조 변수는 해당 인스턴스의 주소를 가리키고 있습니다.
다음과 같이 매개변수가 클래스의 인스턴스와 같을 시 this 키워드를 사용해서 호출한 객체를 구분 짓는 용도로 사용한다.
public Class Person{
int a;
Person(int a){
this.a = a;
}
public void Test(int a){
this.a = a;
}
}
this()는 자신의 다른 생성자를 호출하는 코드로 반드시 생성자의 첫 줄에서만 허용된다.
생성자의 오버 로딩시에 주로 사용하게 된다.
public class Person{
String name;
int age;
//생성자
Person(){
}
//호출
Person(String name){
this(name, 0);
}
//호출
Person(int age){
this(null,age);
}
// 공통 실행되는 코드
Person(String name, int age){
this.name = name;
this.age = age;
}
다음과 같이 생성자 오버 로딩의 경우 중복적으로 this. 을 쓰는 것이 아니라 this() 함수를 통해서 생길 수 있는 중복 코드를 제거할 수 있다.
마지막으로 사용하는 방법이 자기 자신의 참조값을 전달하고 싶은 경우이다.
public Class Person{
int age;
public Person(int age){
this.age = age;
}
public Person getAge(){
return this;
}
}
위와 같이 자신의 참조값을 전달하고 싶을 때 this라는 키워드가 사용된다.
참고 : 이것이 자바다
'Language > Java' 카테고리의 다른 글
JAVA 7주차 : 패키지 (0) | 2021.02.14 |
---|---|
JAVA 6주차 : 상속 (0) | 2021.02.13 |
JAVA 4주차 : 제어문 (0) | 2021.02.12 |
JAVA 3주차 : 연산자 (0) | 2021.02.12 |
JAVA 2주차 : 자바 데이터 타입, 변수 그리고 배열 (0) | 2021.02.11 |
댓글