개발 일지/Java

[Java] 객체(Object)

미숫가루설탕많이 2022. 12. 27. 20:52

 객체(Object)란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에 자신의 속성을 갖고 있으며 다른 것과 식별 가능한 것을 말한다.

 

 컴퓨터 과학에서 객체는 클래스에서 정의한 것을 토대로 메모리에 할당된 것으로 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미한다. 객체는 변수, 자료 구조, 함수 또는 메서드가 될 수 있다.

 

 객체 지향 프로그래밍에서 객체는 클래스의 인스턴스이다. 클래스 객체는 자료와 그 자료를 다루는 명령의 조합을 포함하여 객체가 메시지를 받고 자료를 처리하며 메시지를 다른 객체로 보낼 수 있도록 한다.

 

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

 

  자동차(Car)를 예로 든다면 차가 가지는 일반적인 속성으로는 차의 모델명, 바퀴의 개수, 문의 개수, 색깔 등이고 기능으로는 시동 걸기, 가속하기, 감속하기, 정지하기 등의 기능을 생각해 볼 수 있다.

 

class Car {
    private String model; // 차 모델
    private int wheels; // 바퀴의 개수
    private int doors; // 문의 개수
    private String color; // 색깔
    
    void power() {...}; // 시동 걸기
    void accelerate() {...}; // 가속하기
    void stop() {...}; // 정지하기
}

 

 위 코드를 보면 자동차의 속성과 기능이 Car 클래스 안에 각각 필드와 메서드로 구현되어 있는 것을 확인할 수 있다. 이렇게 자동차와 관련된 데이터와 그 데이터를 다룰 수 있는 방법을 클래스라는 울타리에 모아 하나로 관리해서 좀 더 직관적이고 데이터 관리가 용이해졌다.

 

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

 

 

 

 

객체의 생성


 객체의 생성은 다음과 같이 new 키워드를 사용하여 생성할 수 있다.

 

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



class CarTest {
	public static void main(String[] args) {
    
    Car bmw = new Car(); // Car 클래스를 기반으로 생성된 bmw 인스턴스
    Car audi = new Car(); // Car 클래스를 기반으로 생성된 audi 인스턴스
    Car tesla = new Car(); // Car 클래스를 기반으로 생성된 tesla 인스턴스
    }
}

 

 먼저 특정 클래스 타입의 참조 변수를 선언한다. 참조변수가 선언되면, new 키워드와 생성자를 통해 인스턴스를 생성하여 참조 변수에 할당한다. 여기서 참조 변수는 실제 데이터 값이 아니라 실제 데이터가 저장되어 있는 힙 메모리의 주소값을 가리킨다. new 키워드는 생성된 객체를 힙 메모리에 넣으라는 의미를 갖고 있는데, 생성자를 통해 객체가 만들어지면 해당 객체를 힙 메모리에 넣는 역할을 수행한다.

 

<출처 : codestates>

 

 클래스와 참조 변수는 각각 클래스 영역과 스택 영역이라는 다른 위치에 저장되고, 생성자로 만들어진 인스턴스는 힙 메모리 영역에 들어가면서 객체 내부에는 클래스의 멤버들이 위치하게 된다.

 

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

 

 

 

 

객체의 활용


 객체에 접근하려면 포인트 연산자(.)를 사용하면 된다. 포인트 연산자는 '해당 위치에 있는 객체 안을 보세요'라는 의미를 갖고 있다. 즉, 아래와 같은 방법을 통해서 특정 객체 안에 있는 필드 값 또는 메서드에 접근할 수 있다.

 

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

 

'개발 일지 > Java' 카테고리의 다른 글

[Java] static 키워드  (0) 2022.12.27
[Java] 필드(Field)  (0) 2022.12.27
[Java] 클래스(Class)  (0) 2022.12.27
[Java] 객체 지향 프로그래밍(OOP)  (0) 2022.12.27
[Java] 배열(array)  (0) 2022.12.26