객체는 클래스에 정의되고 설계된 내용 그대로 생성이 된다. 이렇게 생성된 객체를 해당 클래스의 인스턴스(instance)라고 부른다. 객체는 모든 인스턴스를 포괄하는 넓은 의미를 가지고 있는 반면, 인스턴스는 해당 객체가 어떤 클래스로부터 생성된 것인지를 강조한다는 데 그 차이가 있다.
클래스는 크게 네 가지의 요소로 구성되어 있다. 각각 필드(field), 메서드(method), 생성자(constructor), 그리고 이너 클래스(inner class)이다.
public class ExampleClass {
int x = 10; // (1)필드
void printX() {...} // (2)메서드
ExampleClass {...} // (3)생성자
class ExampleClass2 {...} // (4)이너 클래스
}
객체는 두 가지의 요소, 속성과 기능으로 구성되어 있다. 이것들을 각각 필드와 메서드로 정의하는데, 하나의 객체에는 다양한 속성과 기능의 집합으로 이루어져 있다. 이러한 속성과 기능은 이너클래스와 함께 객체의 멤버(member) 라고 한다.
객체의 생성은 다음과 같이 new
키워드를 사용하여 실제 객체를 생성할 수 있다. 그리고 객체를 생성한 후에는 포인트 연산자(.) 를 통해 해당 객체의 멤버에 접근이 가능하다.
필드는 ‘클래스에 포함된 변수'를 의미하는 것으로 객체의 속성을 정의할 때 사용한다. 자바에서 변수는 크게 클래스 변수(cv, class variable), 인스턴스 변수(iv, instance variable), 그리고 지역 변수(lv, local variable) 라는 세 가지로 구분될 수 있다. 필드라 부른 것은 클래스 변수와 인스턴스 변수이며, 이 둘은 다시 static
키워드의 유무로 구분할 수 있다. (static
이 사용되었다면 클래스 변수이다.)
인스턴스 변수 : 인스턴스가 가지는 각각의 고유한 속성을 저장하기 위한 변수로 new 생성자()
를 통해 인스턴스가 생성될 때 만들어진다. 인스턴스는 힙 메모리의 독립적인 공간에 저장되고 객체의 고유한 개별성을 가진다.
클래스 변수 : 인스턴스 변수와는 다르게 공통된 저장공간을 공유한다. 한 클래스로부터 생성되는 모든 인스턴스 들이 특정한 값을 공유해야하는 경우에 주로 static
키워드를 사용하여 클래스 변수를 선언한다.
지역변수 : 메서드 내에 선언되며 메서드 내 ( {}
블록) 에서만 사용가능한 변수이다. 멤버 변수와는 다르게 지역변수는 스택 메모리에 저장되어 메서드가 종료되는 것과 동시에 함께 소멸되어 더이상 사용할 수 없게 된다.
직접 초기화하지 않으면 값을 출력할 때에 오류가 발생하는 지역변수와는 다르게 필드 변수는 직접적으로 초기화를 실행하지 않더라도 강제로 초기화가 이루어진다. 힙 메모리에는 빈 공간이 저장될 수 없기 때문에 이곳에 저장되는 필드는 강제로 초기화되지만, 스택 메모리는 강제로 초기화되지 않으므로 지역 변수는 선언시 반드시 초기화를 실행해주어야 한다.
static
은 클래스의 멤버(필드, 메서드, 이너 클래스)에 사용하는 키워드다. 이 키워드가 사용된 멤버를 정적 멤버 (static member)
라고 하며, 인스턴스 변수와 구분한다. 또한, 인스턴스의 생성 없이도 클래스명.멤버명
만으로도 사용이 가능하다. static
키워드를 사용하면 모든 인스턴스에 공통적으로 적용되는 값을 공유할 수 있다.자바제어자 반환타입 메서드명(매개 변수) { // 메서드 시그니처
메서드 내용 // 메서드 바디
}
void
가 아닌 경우에는 메서드 바디 {}
안에 반드시 return
문이 존재해야 한다.void printHello() { // 반환타입이 void인 메서드
System.out.println("hello!");
}
포인트 연산자(.)
를 통해 메서드를 호출할 수 있다. 메서드 호출 시 괄호() 안에 넣어주는 입력 값을 우리는 (인자(argument)
라고 하는데, 인자의 개수와 순서는 반드시 메서드를 정의할 때 선언된 매개변수와 일치되어야 한다. int multiply(int x, double y) { // 매개변수가 있는 메서드
int result = x * y;
return result;
}
int multiply(4,10)
// 출력값 = 40
- 같은 이름의 메서드명을 사용해야 한다.
- 매개변수의 개수나 타입이 다르게 정의되어야 한다.
public static void main(String[] args) {
Shape s = new Shape ();
s.area();
s.area(5);
s.area(10,10);
s.area(6.0, 12.0);
}
}
class Shape {
public void area() {
System.out.println("넓이");
}
public void area(int r) {
System.out.println("원 넓이 = " + 3.14 * r * r);
}
public void area(int w, int l) {
System.out.println("직사각형 넓이 = " + w * 1);
}
public void area (double b, double h) {
System.out.println("삼각형 넓이 = " + 0.5 * b * h);
}
}
// 출력값
넓이
원 넓이 = 78.5
직사각형 넓이 = 10
삼각형 넓이 = 36.0
위의 예시를 보면, area
라는 같은 메서드명이 사용되었고, 각 메서드의 매개변수나 타입이 다르게 설정되어 있어서 메서드 오버로딩이 적용된다.