객체 지향 프로그래밍
클래스와 인스턴스
객체 지향을 단순하게 생각하면 연관되어 있는 변수(상태)와 메소드(행동)를 하나의 그룹으로 묶어서 그룹핑하는 것이다. 연관된 변수와 메소드들을 모아 놓은 그룹이 클래스(class)이고, 클래스를 이용하여 선언된 객체(object)가 인스턴스(instance)이다.
클래스
클래스는 연관되어 있는 변수와 메소드의 집합이다.
계산기를 클래스로 구현한다고 생각해보면, 입력된 숫자를 저장할 공간(변수)과 더하기, 빼기 등의 계산 기능(메소드)이 있어야 할 것이다.
class Calculator {
int left;
int right;
public int add() {
return this.left + this.right;
}
public int subtract() {
return this.left - this.right;
}
}
- this는 클래스를 통해 만들어진 인스턴스 자신을 가리킨다.
인스턴스
클래스를 사용하여 인스턴스를 만든다. 클래스가 설계도라면, 인스턴스는 설계도로 만든 제품이다.
public class Main {
public static void main(String[] args) {
// 인스턴스 생성
Calculator c1 = new Calculator();
// 인스턴스 변수에 값 할당
c1.left = 1;
c2.right = 2;
// 인스턴스 변수 호출
System.out.println(c1.left); // 1
System.out.println(c1.right); // 2
// 인스턴스 메소드 호출
System.out.println(c1.add()); // 3
System.out.println(c1.subtract()); // -1
}
}
위와 같이 new
키워드를 통해 Calculator 클래스로 c1 인스턴스를 만들 수 있다.
인스턴스를 만들면 인스턴스를 통해 변수에 접근하거나 메소드를 호출할 수 있다.
클래스 멤버와 인스턴스 멤버
멤버
멤버(member)는 구성원이라는 뜻이다. 객체에는 아래와 같은 구성원이 있다.
- 변수
- 메소드
앞에서는 인스턴스를 만들어서 인스턴스의 멤버(변수, 메소드)에 접근했다. 한편, 인스턴스 뿐만 아니라 클래스 또한 멤버를 가질 수 있다.
클래스 변수
하나의 클래스 내에서 공통적으로 사용하는 값은 클래스 변수로 만든다. 이렇게 하면 해당 클래스로 만든 모든 인스턴스가 같은 값을 공유할 수 있다.
계산기 클래스에서 pi와 같이 공통된 상수 값을 제공하는 경우를 생각해보자.
class Calculator {
static double PI = 3.14;
}
static
키워드를 붙이면 클래스의 멤버가 된다.
클래스 변수에 접근하는 방법은 두가지가 있다.
// 1. 인스턴스를 통해 접근
Calculator c1 = new Calculator();
System.out.println(c1.PI);
// 2. 클래스를 통해 접근
System.out.println(Calculator.PI);
클래스 변수의 용도
- 인스턴스에 따라서 변하지 않는 값이 필요한 경우 (final과 함께 사용해서 상수로 선언)
- 인스턴스를 생성할 필요가 없는 값을 클래스에 저장하고 싶은 경우
- 값의 변경 사항을 모든 인스턴스가 공유해야하는 경우
클래스 메소드
메소드가 인스턴스 변수를 참조하지 않아도 된다면 클래스 메소드를 사용해서 불필요한 인스턴스의 생성을 막을 수 있다.
class Calculator {
public static int sum(int left, int right) {
return left + right;
}
}
public class Main {
public static void main(String[] args) {
System.out.println(Calculator.sum(1, 2)); // 3
}
}
클래스 메소드와 인스턴스 메소드 접근 비교
- 인스턴스 메소드는 클래스 멤버에 접근할 수 있다.
- 클래스 메소드는 인스턴스 멤버에 접근할 수 없다.
- 인스턴스 변수는 인스턴스가 만들어지면서 생성되는데, 클래스 메소드는 인스턴스가 생성되기 전에 만들어지기 때문에 클래스 메소드가 인스턴스 멤버에 접근하는 것은 존재하지 않는 인스턴스 변수에 접근하는 것이므로 불가능하다.
참고자료
'언어 > Java' 카테고리의 다른 글
[Java] 상속 (0) | 2023.08.22 |
---|---|
[Java] final (0) | 2023.08.10 |
[Java] abstract (0) | 2023.08.10 |
[Java] 접근 제어자 (0) | 2023.08.10 |