본문 바로가기
Java/객체지향 프로그래밍 기초

2. 객체(Object)

by mozzi329 2022. 7. 8.
728x90
 

 

     

    📌 Goal

    • 객체의 두 가지 구성 요소, 속성과 기능이 무엇인지 이해할 수 있다.
    • 클래스에 기반하여 new 키워드를 통해 객체를 생성하고, 이를 활용할 수 있다.
    • 클래스와 객체의 차이에 대해 설명하고, 둘의 관계를 정의할 수 있다.

     

    📌 객체(Object)

    물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것

    객체는 크게 속성과 기능이라는 두 가지 구성요소로 이뤄져있다. 속성과 기능은 각각 필드와 메서드로 정의되는데, 일반적으로 하나의 객체는 다양한 속성과 기능의 집합으로 이뤄져 있다. 그리고 이러한 속성과 기능은 이너클래스와 함께 객체의 멤버(member)라 부른다.

    멤버(Member)의 구성요소

    코드를 확인해보면, 앞서 언급한 자동차의 속성과 기능이 Car 클래스 안에 각각 필드와 메서드로 구현되어 있는 것을 확인할 수 있다. 차와 관련된 데이터들을 클래스라는 울타리에 모아 하나로 관리해주니 좀 더 직관적이고 데이터 관리가 용이해진다. 각 변수의 자료형은 각 속성값에 알맞는 것으로 정의되어있다. 예를 들면, 차문의 개수를 의미하는 doors는 int형으로, 컬러를 의미하는 color는 String 형으로 정의된 것을 확인할 수 있다.

     

    이러한 방식은 우리가 실제 세계에서 사물을 바라보는 방식에 가장 가까운 방식의 개발 설계 방법론이라 할 수 있다. 지금은 하나의 클래스만을 보고 있지만, 만약 큰 규모의 프로젝트에서 수백 수천 줄의 데이터들을 관리해줘야하는 상황이라면 그 효과와 편리함은 더욱 분명해진다.

     

    class CarTest {
    	public static void main(String[] args) {
    
    	Car bmw = new Car(); // **Car 클래스로 만들어진 bmw 인스턴스**
    	Car tesla = new Car(); // **Car 클래스로 만들어진 tesla 인스턴스**
    	Car audi = new Car(); // **Car 클래스로 만들어진 audi 인스턴스**
    }
    

     

    ✔️ 객체와 인스턴스의 차이

    객체와 인스턴스는 같은 말이라 차이를 두는 것에 큰 의미는 없으며, 따라서 이 두 용어를 혼용하여 사용할 수 있다. 그럼에도, 조금 엄격하게 두 용어를 구분해보자면, 객체는 모든 인스턴스를 포괄하는 넓은 의미를 가지고 있는 반면, 인스턴스는 해당 객체가 어떤 클래스로부터 생성된 것인지를 강조한다는 데 그 차이가 있다고 할 수 있다.

     

    📌 객체의 생성

    new키워드로 생성

    경우에 따라 메서드를 사용해 객체를 생성할 수도 있지만 이 경우도 내부적인 작업을 통해 new키워드를 이용해 객체를 생성하는 것이기 때문에 결국에는 동일한 방식이라 할 수 있다.

    클래스명 참조_변수명; **// 인스턴스를 참조하기 위한 참조변수 선언**
    참조_변수명 = new 생성자(); **// 인스턴스 생성 후, 객체의 주소를 참조 변수에 저장**

     

    ✔️ 객체 생성 흐름

     

    특정 클래스 타입의 참조변수를 선언한다.

    참조변수가 선언되면, 이제 new키워드와 생성자를 통해 인스턴스를 생성하여 참조변수에 할당한다. 여기서 참조 변수는 실제 데이터 값이 아니라 실제 데이터가 저장되어 있는 힙 메모리의 주소값을 가리킨다.
    ※ new 키워드는 생성된 객체를 힙 메모리에 넣으라는 의미를 가진다.


    new 키워드를를 통해 클래스의 객체를 생성하고, 해당 객체는 힙 메모리에 넣고 그 주소값을 참조변수에 저장된다.

    참조변수는 객체의 실제 값이 아닌 힙에 저장되어 있는 주소값을 가리키게 된다.


    클래스 Person과 참조 변수 p는 각각 클래스 영역과 스택 영역이라는 다른 위치에 저장된다. 

    또한 메서드 구현 코드는 클래스 영역에 저장되고 객체 안에서는 그 위치를 가리킨다. 즉 같은 클래스로 만든 모든 객체는 동일한 메서드 값을 공유하기 때문에 여러 번 같은 메서드를 선언해주는 것이 아니라 한번만 저장해두고 필요한 경우에만 클래스 영역에 정의된 메서드를 찾아 사용할 수 있다.

     

    📌 객체의 활용

      . 을 이용하여 특정 인스턴스 객체의 필드와 메서드, 즉 객체의 멤버들에 접근

    기본적인 문법은 다음과 같다.

     참조 변수명.필드명 // **필드값 불러오기**
     참조 변수명.메서드명() **// 메서드 호출**
    

     

    댓글