1. 클래스(Class)와 객체(Object)
1-1. 객체(Object)
Java의 클래스를 이해하기 위해서는 객체를 먼저 이해할 필요가 있다.
객체는 실제 세계에서 유형 또는 무형으로 존재하는 식별 가능한 모든 것을 의미한다.
예를 들어 유형으로는 사람, 컴퓨터, 고양이 등이 존재할 수 있고, 무형으로는 생산, 운동, 운전 등이 존재할 수 있다.
1-2. 클래스(Class)
클래스는 실제 세계에 존재하는 객체를 Java 프로그램에서 구현하고자 만든 일종의 설계도이다.
클래스는 필드(Field), 생성자(Constructor), 메서드(Method)로 구성되어 있으며, 이는 생략될 수 있다.
👉 필드(Field) : 객체를 구성하는 속성이며, 데이터가 저장되는 공간이다. 멤버 변수라고도 부른다.
👉 생성자(Constructor) : 변수를 초기화 하듯, 객체가 생성될 때 초기화를 해주기 위한 담당
👉 메서드(Method) : 객체의 동작 부분을 담당하며, 정의된 기능을 수행할 수 있다.
고양이라는 객체를 구현하고자 하는 클래스를 구성하자면 다음과 같이 할 수 있다.
public class Cat{
// 필드(Field)
String name;
int age;
String species;
// 생성자(Construtor)
Cat(String name, int age, String species) {
this.name = name;
this.age = age;
this.species = species;
}
// 메서드(Method)
void eat() {
System.out.println("yamy");
}
void sleep() {
System.out.println("zzz");
}
}
클래스를 정의하기 위해서 class 키워드를 사용하여 생성하며,
각 클래스는 접근 제어자를 통하여 해당 클래스로의 접근 가능한 범위를 제한할 수 있다.
✍️ 접근 제어자
클래스 내부 | 동일 패키지 | 하위 클래스 | 그 외 영역 | |
public | 가능 | 가능 | 가능 | 가능 |
protected | 가능 | 가능 | 가능 | 불가능 |
default | 가능 | 가능 | 불가능 | 불가능 |
private | 가능 | 불가능 | 불가능 | 불가능 |
접근 제어자는 클래스 이외에도 필드, 메서드 등에도 사용할 수 있으며,
별도로 지정하지 않으면 default 값이 지정된다.
1-3. 인스턴스(Instance)
프로그램 실행 시 선언이 완료된 클래스는 JVM 메모리 영역에 로드된다.
이렇게 로드된 클래스를 사용하여 힙 영역에 객체를 생성할 수 있게 된다.
이러한 과정을 '클래스의 인스턴스화'라고 한다.
🖍 편의상 인스턴스와 객체가 혼용되어 사용되는 경우가 있다.
인스턴스는 new 연산자를 통해 생성이 가능하며, 힙 영역에 인스턴스를 저장하며 그 주소값을 변수에 반환한다.
public static void main(String[] args) {
// 인스턴스(객체) 생성
// 클래스명 변수명 = new 클래스명(생성자)
Cat cat1 = new Cat();
// 메서드 사용
cat1.eat();
}
✍️ 생성자 정의
변수 선언 시에 초기화가 필요한 것처럼 인스턴스를 생성할 때에도 초기화가 필요한데
인스턴스의 초기화는 생성자가 수행하게 된다.
🔹 기본 생성자
클래스 내부에 생성자를 별도로 생성하지 않는 경우 컴파일러에 의하여 자동으로 추가되는 생성자이다.
🔹 묵시적 생성자
인스턴스 생성 시에 파라미터 값을 받지 않는 생성자이다.
🔹 명시적 생성자
인스턴스 생성 시에 지정한 파라미터 값을 받는 생성자이다.
🖍 명시적 생성자를 선언하면 컴파일러는 클래스에 이미 생성자가 있다고 판단하기 때문에
기본 생성자, 즉 묵시적 생성자를 생성하지 않는다.
묵시적 생성자를 함께 사용하기 위해서는 명시적 생성자와 함께 선언해 주어야 한다.
// 묵시적 생성자
Cat() {}
// 명시적 생성자
Cat(String name, int age, String species) {
this.name = name;
this.age = age;
this.species = species;
}
✍️ this 키워드와 this()
Cat(String name, int age, String speciese) {
this.name = name; // 인스턴스변수 = 매개변수
this.age = age;
this.speciese = speciese;
}
명시적 생성자에서 this 키워드는 인스턴스화 되었을 때 자신을 나타내어, 매개변수와 구별하기 위하여 사용된다.
즉 this.name 은 인스턴스 변수인 것이고, name 은 매개변수로 들어온 지역변수를 가리킨다.
this() 는 같은 클래스 내의 다른 생성자를 호출할 때 사용하는 것으로 this 키워드와 용도가 전혀 다르다.
Cat() {
this("nabi", 2, "치즈냥"); // this()
}
Cat(String name, int age, String speciese) {
this.name = name;
this.age = age;
this.speciese = speciese;
}
이렇게 위의 생성자를 호출하게 되면 this() 에 의하여 Car(String, int, String)을 호출 받아서 연결된다.
'JAVA' 카테고리의 다른 글
객체 지향 4대 특성 : 다형성, 캡슐화 (0) | 2022.08.22 |
---|---|
객체 지향 4대 특성 : 추상화, 상속 (0) | 2022.08.21 |
조건문과 반복문 (0) | 2022.08.19 |
연산자 (0) | 2022.08.18 |
변수(Variable) (0) | 2022.08.16 |