클래스와 객체

goose_bumps·2024년 4월 14일

Java

목록 보기
1/21
post-thumbnail

1. 객체지향

객체지향의 기본 개념은 실제 세계는 사물(=객체)로 이루어져 있으며 발생하는 모든 사건들은 사물간의 상호작용이다. 이 사물들의 속성과 기능을 분석 후 데이터와 함수를 정의하여 가상 세계에서 재현하는 것이 객체지향의 기본 개념이다.

그렇다면 왜 객체지향을 사용할까?
세 가지 이유가 있다

  1. 코드의 재사용이 쉽다
  2. 코드의 관리가 용이하다
  3. 신뢰성이 높은 프로그래밍이 가능하다

클래스나 인터페이스를 사용하면 코드의 재사용이 쉽고 관리가 용이하며 제어자와 메서드를 사용하면 데이터 보호가 가능하다.

이 중 가장 큰 장점은 코드의 재사용이 높고 유지보수가 용이한 것이다.

2. 클래스와 객체

클래스란? 객체를 정의하여 높은 것을 말한다. 여기서 객체는 실제로 존재하는 것, 개념이나 논리와 같은 무형적인 것도 포함된다.

클래스는 객체를 생성하는 용도로 사용되는데 클래스=객체는 아니다.
클래스가 설계도라면 객체는 그 설계도로 만든 제품이라 생각하면 된다

예를 들어, 자동차 설계도(클래스)를 사용하여 자동차1,자동차2... 이런식으로 여러 객체를 만들 수 있는데 클래스가 객체와 같은 것은 아니고 객체를 생성하기 위해 존재하는 것이다.

여기서 클래스로부터 객체가 만들어지는 과정을 인스턴스화라 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)라 한다.
위의 예시에서 자동차가 자동차 설계도 클래스의 인스턴스인 것이다.

그럼 인스턴스를 생성하는 방법을 알아보자

class Car{

} //자동차 클래스

public class ObjectOriented1 {
	public static void main(String[] args) {
		Car c1 = new Car(); //자동차 인스턴스 생성
	}
}

이처럼 클래스가 존재할 때
클래스명 참조변수명;
참조변수명 = new 클래스명();
선언과 초기화를 따로 해도 되고 동시에 해도 된다.

생성과정은 이렇다
1. 클래스명 참조변수명; -> 메모리에 참조변수를 위한 공간이 마련된다(인스턴스는 생성되지 않음)
2. 참조변수명 = new 클래스명(); -> new 연산자에 의해 인스턴스가 메모리의 빈 공간에 생성되고 멤버변수는 기본값으로 초기화 된다. 여기서 인스턴스는 Heap 영역에 생성이 되고 참조변수에는 그 인스턴스의 위치를 알려주는 주소값이 저장되는 것이다.

*연산자 new는 인스턴스를 생성한다. 참조변수에 대입 연산자를 사용함으로써 참조변수가 그 인스턴스를 가리키게 된다(=주소값을 가지게 된다)

만약 다른 참조변수를 참조변수에 대입하면 어떻게 될까?

Car c1 = new Car();
Car c2 = new Car();
c1 = c2;

여기서 c2를 c1에 대입하면 c2에 저장되어 있는 인스턴스의 주소값이 c1에 대입된다. 기존에 c1에 저장되어 있던 주소값은 c2의 주소값으로 바뀌게 되어 c1이 원래 참고하고 있던 인스턴스는 더 이상 사용이 불가하다.

*둘 이상의 참조변수가 하나의 인스턴스를 가리키는(참조하는) 것은 가능하지만 하나의 참조변수가 여러 개의 인스턴스를 가리키는 것은 불가하다

*자신을 참고하고 있는 참조변수가 하나도 없는 인스턴스는 더 이상 사용되어질 수 없기에 Garbage Collector에 의해 자동적으로 메모리에서 제거된다

0개의 댓글