클래스 멤버 억세스
클래스의 멤버 (변수, 메서드)는 외부에서 억세스 할수 있는지 여부에 따라 public 와 private로 나눌 수 있습니다. 이렇게 구분 하는 것은 객체지향 프로그램의 사상인 Encapsulation과 연관이 있습니다. 가능하면 최소한의 정보만 외부에 노출시켜서 객체의 잘못된 사용을 막겠다는 취지라고 하네요.
public : 프로그램의 다른 어떤 코드도 억세스 가능
private : 같은 클래스 내의 멤버만 억세스 가능
default (public이나 private 설정이 없는 경우) : 보통은 public과 동일하나 패키지를 사용하는 경우는 같은 패키지 내에서만 억세스가 가능합니다.
일반적으로 자바 프로그램의 클래스에서는 setter, getter메서드를 정의해서 클래스 외부에서의 억세스 창구로 사용합니다.
아래 예제를 보시면 MyClass의 private 멤버인 alpha를 어떻게 외부 클래스에서 억세스하는지 알 수 있습니다.
객체 - object
정수 등과 같은 기본타입 뿐 아니라 객체, 오브젝트를 메서드의 인수 (argument) 로 사용할 수 있습니다.
그런데, 인수를 서브루틴(메서드) 로 넘기는 상황은 call by value (값 전달) 과 call by reference (레퍼런스 전달) 두 가지로 구분할 수 있습니다. 두 경우의 차이점은 서브루틴의 조작에 의해 파라메터에 변경이 가해질 때 인수에 영향을 주는지 여부입니다.
인수가 자바의 기본타입 (정수 등) 인 경우, call by value에 해당됩니다. 하지만 인수가 객체인 경우, 묵시적으로 call by reference 형식을 따르기 때문에 파라메터의 조작은 인수에 영향을 주게 됩니다.
메서드 오버로딩
객체지향 프로그래밍의 사상 중 하나인 "Polymorphism" 을 구현하기 위한 중요한 요소 중 하나가 메서드 오버로딩입니다.
간략하게 설명하면, 동일한 클래스 내의 서로 다른 메서드가 동일한 이름을 공유하는 것인데요, 타입이나 파라메터의 종류/수가 다르지만 실질적으로 수행하는 역할이 같은 메서드끼리 서로 같은 이름을 사용함으로써 프로그램이 더 구조적인 모습을 갖추도록 하는 역할을 수행합니다.
아래는 간단한 오버로딩의 예입니다.
참고로 오버로딩은 뒤에 나오는 오버라이딩과는 전혀 다른 개념입니다.
컨스트럭터 오버로딩
메서드 뿐 아니라 컨스트럭터도 오버로딩할 수 있습니다. 컨스트럭터 오버로딩을 통해서 다양한 파라메터에 대응할 수 있습니다.
위 예제에서는 해당 클래스의 인스턴스가 생성될 때 사용된 파라메터의 갯수나 타입에 따라, 해당 오브젝트의 멤버변수가 다르게 초기화 됩니다.
정적 변수 static variables
클래스가 오브젝트를 만들어 내는 틀이라고 하면, 각 오브젝트들의 멤버들은 당연히 서로 다른 값을 가지게 됩니다. 하지만 어떤 특정 멤버는 오브젝트와 무관하게 동일하여야 할 때가 있죠. 그런 경우 static을 사용합니다. static은 메서드와 변수에 모두 사용 가능합니다. 정적 변수나 정적 메서드는 오브젝트와 무관하기 때문에 "클래스이름.멤버" 의 형식으로 호출합니다. (하지만 오브젝트.멤버 형식으로 호출도 가능 합니다. 이때 해당 스태틱 멤버는 하나의 클래스의 서로다른 인스턴스라고 해도 동일한 레퍼런스를 가집니다)
정적 메서드 Static method
멤버 변수뿐 아니라 메서드도 static으로 정의할 수 있습니다.
정적 메서드도 정적 변수처럼 클래스명.메서드로 호출하는 점은 동일하고, 해당클래스의 오브젝트 (인스턴스) 생성 여부와 무관하게 호출할 수 있습니다. 스태틱 메서드는 몇 가지 제한을 가지는데, 아래와 같습니다.
- 다른 메서드를 호출할 때 오직 스태틱 메서드만 호출 가능
- 스태틱 데이터만 억세스 가능
- this reference를 가지지 않음
정적 블록 Static Blocks
자바에서는 클래스의 일부분을 정적 블록으로 설정할 수 있습니다. 정적 블록은 오브젝트가 생성되기 전에 항상 실행되는 특징을 가지고 있습니다.
varargs: Variable length arguments
일반적으로 메서드는 정해진 갯수의 인수를 받지만, 정해지지 않은 갯수의 인수를 받아야 하는 경우도 있습니다.
그런 경우를 위해서 자바는 varargs를 지원합니다.
varargs는 점 세개 (...)로 표시합니다. 아래 예제가 있습니다.
주의해야 할 점은 varargs로 정의된 인수는 배열로 정의된다는 것 입니다.