객체지향 프로그래밍에 대한 글을 반드시 먼저 읽고 참조해주시길 바랍니다.
요약
- 클래스는 객체를 생성하기 위한 설계도. 속성과 기능으로 구성됨.
- 인스턴스화: 클래스로부터 객체를 생성하는 과정
- 인스턴스: 인스턴스화로 생성된 객체
자바에서 클래스는 class
명령을 사용해서 선언합니다.
클래스를 구성하는 것들은 멤버
라고 부르며 이는 속성에 해당하는 멤버변수(또는 필드)
과 기능에 해당하는 메소드
가 있습니다. 그리고 멤버변수를 초기화하는데 필요한 생성자
를 가집니다.
즉, 클래스는 class
명령으로 선언되고, 멤버변수와 메소드, 생성자를 가지고 있습니다.
멤버변수
는 객체 내부에서 값을 직접 저장하게 되는 변수입니다. 선언 위치에 따라서 다시 클래스변수, 인스턴스변수, 지역변수
로 나뉘어집니다.
변수의 종류 | 선언위치 | 생성시기 |
---|---|---|
클래스변수 | 클래스 | 클래스가 메모리에 등록될 때 |
인스턴스변수 | 클래스 | 인스턴스가 생성될 때 |
지역변수 | 메소드, 생성자, 코드 블록{} | 변수 선언문이 실행될 때 |
public class Oop {
int a; //인스턴스변수
static int b; //클래스변수
void method() {
int c; //지역변수
}
}
인스턴스변수
는 클래스 영역(클래스 내부)에 선언되는 변수이며, 클래스의 인스턴스가 생성될 때 생성됩니다. 따라서 인스턴스변수에 접근, 제어하기 위해서는 먼저 인스턴스를 생성한 후 수행해야합니다.
인스턴스변수
는 인스턴스가 독립적인 메모리 공간을 할당받으므로 인스턴스마다 서로 다른 값을 가지게 할 수 있습니다.
클래스변수
는 클래스 영역에 선언되는 변수이며, 인스턴스변수 선언 앞에 static
키워드를 붙여 생성합니다.
클래스변수
는 모든 인스턴스와 동일한 메모리 공간을 공유합니다. 그렇기 때문에 인스턴스를 생성하기 전에도 클래스변수는 접근할 수 있습니다.
class C { static int a = 1; } (...) C c1 = new C(); C c2 = new C(); c1.a = 5; //a는 클래스변수이므로 c1.a 값을 바꿔도 c2.a값도 함께 바뀌게 된다.
지역변수
는 메소드나, 생성자, 코드 블록에서 선언되는 변수입니다. 지역변수
는 해당 코드 블록{}
내에서만 유효하며 코드 블록이 종료되면 메모리가 소멸됩니다.
메소드
는 클래스 내부에서 정의되는 함수입니다. 객체의 기능을 구현합니다.
생성자(Constructor)
는 객체가 생성될 때 자동으로 호출되는 메소드로, 객체가 생성되면서 멤버변수를 지정된 값으로 초기화하는 역할을 수행합니다. 생성자는 반드시 클래스의 이름과 동일한 이름을 갖습니다.
방금까지 배운 클래스, 멤버변수, 메소드, 생성자 개념을 가지고 Car 클래스를 하나 만들어보겠습니다.
public class Car {
public String color;
public int numberOfDoor;
public Car() {}
void startEngine() {
System.out.println("시동 걸기");
}
void getColor() {
System.out.println("차의 색상: " + color);
}
}
방금 클래스를 하나 만들었으니 이제 인스턴스화를 거쳐 인스턴스를 하나 생성해보겠습니다.
클래스는 참조형이므로 우리가 변수 선언하듯이 클래스명을 써주고 이름을 적습니다. 그리고 인스턴스를 생성하는 연산자인 new
를 통해 생성자를 불러와 인스턴스화 과정을 거쳐 인스턴스를 생성합니다.
클래스명 인스턴스_이름 = new 클래스명();
이렇게 자바에서 기본적으로 제공되는 기본형 타입 외에 클래스 처럼 프로그래머가 생성해 하나의 타입형태로 제공하는 것을 사용자정의 타입(User-defined Type)
이라고 부릅니다.
기본형은 8가지 였지만 참조형은 몇 개인지 명확하게 내리지 못했던 이유가 이런 사용자 정의타입 때문이었습니다.
위에서 만든 Car 클래스를 실제로 인스턴스화 하면 아래와 같습니다.
public class Oop {
public static void main(String[] args) {
Car car = new Car();
}
}
객체의 멤버변수와 메소드 접근은 .
연산자를 통해 접근합니다. color
멤버변수와 startEngine(), getColor()
메소드에 접근해보겠습니다.
public class Oop {
public static void main(String[] args) {
Car car = new Car();
car.color = "검정";
car.startEngine();
car.getColor();
}
}