
객체지향의 기본 개념은 실제 세계는 사물(=객체)로 이루어져 있으며 발생하는 모든 사건들은 사물간의 상호작용이다. 이 사물들의 속성과 기능을 분석 후 데이터와 함수를 정의하여 가상 세계에서 재현하는 것이 객체지향의 기본 개념이다.
그렇다면 왜 객체지향을 사용할까?
세 가지 이유가 있다
클래스나 인터페이스를 사용하면 코드의 재사용이 쉽고 관리가 용이하며 제어자와 메서드를 사용하면 데이터 보호가 가능하다.
이 중 가장 큰 장점은 코드의 재사용이 높고 유지보수가 용이한 것이다.
클래스란? 객체를 정의하여 높은 것을 말한다. 여기서 객체는 실제로 존재하는 것, 개념이나 논리와 같은 무형적인 것도 포함된다.
클래스는 객체를 생성하는 용도로 사용되는데 클래스=객체는 아니다.
클래스가 설계도라면 객체는 그 설계도로 만든 제품이라 생각하면 된다
예를 들어, 자동차 설계도(클래스)를 사용하여 자동차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에 의해 자동적으로 메모리에서 제거된다