JAVA는 객체지향적인 프로그래밍의 대표적인 언어이다. 객체지향 프로그래밍의 가장 중요한 부분 중 한가지는 “객체”를 어떻게 사용하느냐이다. Class는 객체를 사용하는데 이용되는 중요한 개념이다.
“객체를 정의해 놓은 것”
“객체의 설계도”
“객체에 속하는 상태를 표현하는 멤버변수(variable) 과 기능을 표현하는 메소드(method)를 정의한 것이다.
클래스와 객체의 관계를 설명할 때, “붕어빵 틀”과 붕어빵을 이용하여 많이 설명한다.
붕어빵 틀은 클래스이고, 붕어빵 틀을 이용해 만들어낸 붕어빵을 객체라고 한다. 이때, 붕어빵안에 담는 재료(데이터)에 따라 팥 붕어빵, 슈크림 붕어빵 등 다양한 붕어빵을 만들어 낼 수 있다.
이렇게 정의된 클래스를 통해 객체를 생성하는 과정을, “클래스의 인스턴스화” 라고 하고, 클래스를 통해 생성된 객체를 인스턴스라고 한다.
static 키워드가 함께 사용된 변수
- JAVA에서 클래스를 정의하는 방법 다음과 같이
**class라는 키워드**를 통해 정의class 키워드앞에 접근제어자를 함께 사용- 클래스의 이름은 “대문자”로 시작하도록 한다.
예를 들어 가정에 흔히 찾아볼 수 있는 TV를 객체로 만든다고 해보자. 이때 TV 객체에는 다음과 같은 정보가 들어있어야 할 것이다.
- 멤버변수(상태): 해상도, 볼륨, 현재 채널 정보 등
- 메소드(기능) : 전원 on/off, 볼륨 조절기능, 채널 번경하기.
위 내용을 바탕으로 클래스를 정의해보면 다음과 같이 표현할 수 있다.
// TV 클래스 정의
public class TV{
String resolution; //해상도 (FHD,QHD,UHD 등) ,
boolean power; //전원 상태 , (인스턴스 변수)
static int channel; //채널 정보 , (클래스 변수)
void power() {}; //전원 on / off
void channelUp() {}; // 채널 올리기
void channelDown() {}; // 채널 내리기
int channelSearch() {} // 채널 검색
}
new 키워드를 사용하여 인스턴스를 생성할 수 있다.
이를 통해 각각 서로에게 영향을 주지 않는 서로 다른 객체들을 생성할 수 있다.
TV lgTv; //TV 클래스의 객체에 대한 주소를 가지는 lgTv라는 이름을 가진 참조변수 선언
lgTv = new TV(); //lgTv라는 이름을 가진 인스턴스 생성 후 lgTv 참조변수에 할당
TV lgTv = new TV(); //변수 선언과 인스턴스 생성을 동시에
위와 같이 new키워드를 통해 인스턴스를 생성하게 될때 컴퓨터 내부적으로는 어떤 일이 일어날까?

위 그림은 TV 클래스를 이용하여 lgTv변수 라는 인스턴스를 생성했을 때, 메모리에 생기는 일을 간단게 표현한 것이다.
그림에서 보다시피 인스턴스가 생성되면, 따로 클래스의 멤버변수와 메소드가 정의된 부분이 모인 인스턴스의 메모리가 생성이 되고, 해당 위치의 주소값을 선언하면서 명명한 변수의 값으로 저장하게 된다.
이때 잘 기억해야 할 것은 lgTv변수 에 저장된 값은 메모리 상에 만들어진 인스턴스의 메모리 주소라는 것이다. 즉 변수에 직접 객체의 값들이 할당되는 것이 아니라, 주소만 참조하는 것뿐이다.
따라서 인스턴스는 참조변수를 통해서만 다룰 수 있다.
객체의 멤버변수나, 메소드에 접근할 때는
(.)연산자를 사용한다.
//생성한 인스턴스안에서 변수에 접근하는 예시
lgTv.resolution = "QHD";
System.out.println(lgTv.resolution); //"QHD" 출력
"클래스 혹은 클래스 내에서 변수와 메소드의 사용 범위를 설정해주는 키워드"
접근제어자에는 4가지 종류가 있다.
private이 붙은 변수나 메서드는 해당 클래스 안에서만 접근이 가능default 접근 제어자가 자동으로 설정protected가 붙은 변수나 메서드는 동일 패키지의 클래스 또는 해당 클래스를 상속받은 클래스에서만 접근이 가능public 접근 제어자가 붙은 변수나 메서드는 어떤 클래스에서도 접근이 가능“접근 제어자를 이용하면 프로그래머의 실수를 방지할 수 있고 기타 위험 요소를 제거할 수 있는 등의 장점이 있다.”
private < default < protected < public 순으로 접근을 많이 허용한다.
- 클래스에서 공유되는 변수나 메서드를 정의할 때 사용
- static 키워드가 붙은 변수나 메소드는 인스턴스를 따로 생성하지 않고, 바로 호출이 가능하다.
class Counter {
static int count = 0;
public static int getCount() {
return count;
}
}
public class Main(){
public static void main(String[] args){
System.out.println(Counter.getCount()); // 인스턴스 생성 없이 바로 호출
}
}
static키워드로 선언된 변수들은 모든 인스턴스에서 동일할 내용을 공유한다는 점이 특징이다. 즉 서로다른 인스턴스에서 static키워드로 선언된 변수와 메소드는 동일한 메모리 주소 값을 참조하여 사용하게 되는 것이다.
class Counter {
static int count = 0;
Counter() {
count++;
}
}
public class Sample {
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();
System.out.println(Counter.count);
}
}
// 출력 결과
// 2
[Java] 자바 - 접근제어자 public, private, protected 및 default
[JAVA] 클래스란? (클래스, 객체, new, 메소드, 생성자, this...)
책 - <Java의 정석>