본문 바로가기
java/basic

자바 클래스, 객체, 인스턴스

by cactuslog 2024. 3. 31.

클래스 ( 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