클래스 ( Class )
1. 객체를 생성하기 위한 템플릿 또는 설계도이다.
2. 특정 유형의 객체들이 공통적으로 가지게 될 속성과 메서드를 정의한다.
3. 즉 데이터와 데이터를 조작하는 방법을 함께 묶는 수단을 제공한다.
public class Animal {
String name;
int age;
void introduce() {
System.out.println("Animal{" +
"name='" + this.name + '\'' +
", age=" + this.age +
'}');
}
}
- Animal 클래스는 이름, 나이 속성을 가진다.
- 자바에서는 이를 멤버 변수 또는 필드라 한다.
- introduce 함수는 Animal 클래스에 정의된 행위이다.
- 이를 메서드라고 한다.
객체 ( Object )
1. 객체는 클래스에 기반하여 생성된 실체이다.
2. 객체는 클래스에서 정의된 속성과 메서드를 실제로 가지게 된다.
3. 각 객체는 동일한 클래스를 기반으로 생성되었더라도 독립적인 상태(속성)를 가지며, 클래스에 정의된 행위(메서드)를 수행할 수 있다.
4. 예를 들어, '동물' 클래스를 기반으로 '강아지' 객체와 '고양이' 객체를 생성할 수 있으며, 각각의 이름, 나이 속성을 가질 수 있다.
인스턴스 ( Instance )
1. 인스턴스는 객체와 같은 의미로 사용되며, 특히 클래스로부터 생성된 객체를 강조할 때 사용한다.
2. 설계도인 클래스를 사용하여 실제로 메모리에 할당되어 생성된 객체를 해당 클래스의 인스턴스라고 부른다.
3. 인스턴스화 ( instantiation )는 클래스를 기반으로 새 객체를 생성하는 과정을 말한다.
객체와 인스턴스의 관계
1. 객체는 광범위한 개념으로, 클래스와 같은 틀에 따라 생성될 수 있는 모든 실체를 의미한다.
2. 인스턴스는 그 객체가 실제로 메모리 상에 할당되어 생성된 상태를 말하며, 특정 클래스의 객체임을 강조할 때 사용
3. 용어상 인스턴스는 특정 클래스와의 관계를 명확히 할 때 주로 사용한다.
4. 예를들어 이 객체는 A 클래스의 인스턴스라고 말할 때 그 객체가 메모리에 할당되어 실제로 존재하며 A 클래스에 정의된 속성과 행위를 가지고 있다는 특정한 상황을 강조하는 것이다.
5. 그러나 둘 다 클래스에서 나온 실체라는 핵심의미는 같기 때문에 둘을 구분하지 않고 사용한다.
객체 생성
public class Main {
public static void main(String[] args) {
Animal animal = new Animal();
animal.name = "happy";
animal.age = 10;
animal.introduce();
}
}
1. new 클래스명() 을 사용하여 메모리에 실제 객체를 생성하고 이 객체에 접근할 수 있는 주소인 참조값을 반환한다.
2. animal 변수에는 객체가 들어있는 것이 아니라 참조값이 들어있다.
3. 메모리에 존재하는 객체에 접근하는 방법은 .(dot)을 사용한다.
4. animal.name = "happy"는 animal에 저장된 참조값으로 객체에 접근하고 name 필드에 값을 할당한다.
많이 실수하는 인스턴스 복사
자바에서 대입이란 변수에 들어 있는 값을 복사해서 전달하는 것을 말한다.
int num1 = 10;
int num2 = num1;
System.out.println("num2 = " + num2);
num2 변수에 값을 할 당할 때 num1의 값인 10을 복사해서 할당한다.
참조값인 경우 주의해야한다.
Animal animal1 = new Animal();
animal1.name = "happy";
animal1.age = 10;
Animal animal2 = new Animal();
animal2.name = "happy";
animal2.age = 10;
System.out.println("animal1 = " + animal1); // lectureclass.Animal@448139f0
System.out.println("animal2 = " + animal2); // lectureclass.Animal@7cca494b
1. 출력 결과를 보면 변수에 인스턴스 자체가 아닌 참조값이 들어있다.
2. 따라서 복사할 경우 참조값이 복사가 된다.
public class Main {
public static void main(String[] args) {
Animal animal1 = new Animal();
animal1.name = "happy";
animal1.age = 10;
Animal animal2 = animal1;
animal2.name = "nero";
animal2.age = 20;
animal1.introduce(); // Animal{name='nero', age=20}
animal2.introduce(); // Animal{name='nero', age=20}
}
}
1. animal2에 이름이 happy이고 나이가 10살인 객체가 복사되는게 아니라 animal1의 참조값이 그대로 복사가된다.
2. 따라서 animal2에서 name, age에 접근해서 값을 할당하면 animal1의 필드가 수정되어버린다.
'java > basic' 카테고리의 다른 글
자바 메모리 구조 (스택, 힙, 메서드 ...) (0) | 2024.05.05 |
---|---|
생성자 (0) | 2024.04.13 |