프로그래밍 언어 Java하면 대표적인 특징으로 객체지향 프로그래밍 언어라고 알려져 있다.
그렇다면 객체지향은 절차지향과 어떤 차이가 있을까?
재사용성이 높고, 교체가 용이하며, 신뢰성이 높다.
현실의 실존하는 대상으로부터 상태와 행위를 추출하는 작업을 추상화라고 하며,
이렇게 추출된 속성(필드)와 기능(메서드)를 클래스라는 타입으로 나타낸다.
클래스는 객체를 만들어내는 설계도가 되며, 구체화(실체화)된 대상을 객체 또는 인스턴스라고 한다.
객체는 멤버를 가지고 있으며, 멤버변수(필드)와 멤버함수(메서드)를 가진다.
이렇게 생성된 객체간의 상호작용으로 문제를 해결하는 것이 객체지향 프로그래밍의 본질이다.
멤버는 클래스 멤버와 인스턴스 멤버로 구분된다.
객체는 서로다른 메모리 위치에 생성되기 때문에, 서로다른 상태값을 가질 수 있는데 때로는 공통된 상태값을 사용하거나,유지해야하는 경우가 있다. 이러한 경우를 위해 클래스 멤버변수를 사용할 수 있다.
static 키워드를 통해 클래스 멤버임을 구분하며, 이는 클래스가 메모리가 로드될 때 class Area에 등록된다.
아무런 키워드가 붙지 않으면 인스턴스 멤버임을 나타내며, 이는 생성자를 통해 실제로 생성될 때 Heap 영역에 등록된다.
변수는 선언된 위치에 따라 멤버변수와 지역변수로 나뉘며, 멤버변수는 기본값으로 초기화된다.
앞서 변수는 사용되기 전에 반드시 초기화되어야 한다고 했는데, 멤버변수의 경우 각 타입의 기본값으로 초기화되는 특징을 가지고 있다.
멤버함수(메서드)는 DRY(Don't Repeat Yourself),블록형태의 프로그래밍을 가능하게 한다.
메서드는 선언부와 구현부로 나뉘며, 선언부는 리턴타입,메서드이름,매개변수 목록으로 구성된다.
구현부는 실제 동작 로직을 작성한 것이며, 선언부의 리턴타입과 일치하거나 자동 형변환될 수 있는 것을 유일한 1개의 값을 반환해야 한다.
Java는 CALL-BY-VALUE
파라미터로 전달된 값은 모두 복사되며, Primitive Type은 ReadOnly, Reference Type은 Read/Write가 가능하다.
Method Overloading(메서드 중복정의)
메서드를 작성하다보면, 로직자체는 동일하지만 서로다른 타입의 파라미터를 이용해야하는 경우가 생길 수 있다.
이러한 상황을 위한 메소드 오버로딩을 지원하며 조건은 다음과 같다.
몇개의 값이 주어질 지 모를 때 Variable Arguments(...)
같은 타입의 파라미터가 가변적인 갯수로 주어질 때 메소드의 선언부에 Type...으로 사용하면, 호출 시 내부적으로 배열을 생성하여 전달한다. 단, ...을 사용하는 대상은 매개변수 목록 중 가장 마지막에 위치해야한다.
생성자를 통해 인스턴스가 만들어진다.
클래스는 설계도일 뿐, 그자체로는 상호작용할 수 있는 대상이 아니다. 생성자 호출을 통해 Heap 메모리 영역에 올라가고, 참조변수를 통해 접근할 수 있게 된다.
생성자도 오버로딩을 지원한다.
생성자는 메소드로 볼 수 있고, 메소드명은 사전에 정해져 있기 때문에 매개변수의 목록(개수,종류,수)가 달라지면 같은 역할을 하는 여러개의 생성자를 만들 수 있다.
this는 현재 호출된 인스턴스 객체를 나타내는 참조변수
지역변수(매개변수)와 객체변수(인스턴스멤버)가 같은 이름으로 주어질 때 구분하기 위해서 사용한다.
혹은 어떤 생성자에서 다른 생성자를 호출하고자 할 떄 this(...)를 사용한다. 이 경우 가장 윗줄에 와야한다.(그렇지 않으면 이미 초기화가 이루어진 값이 생성자에 의해 다시 변경될 수 있기 때문이다.)
인스턴스와 관련된 대상에서 내부적으로 사용할 수 있다.(생성자,인스턴스메서드,인스턴스 초기화블록)