객체지향 프로그래밍(Object Oriented Programming)
객체지향 프로그래밍이란?
- 컴퓨터 프로그래밍 패러다임 중 하나
- 프로그램을 명령어의 목록으로 보는 시각에서 벗어나, 독립된 단위인 객체의 모임
- 각각의 객체는 메세지를 주고받고, 데이터를 처리
기본 구성 요소
- 클래스(Class)
- 같은 종료의 집단에 속하는 속성과 행위를 정의한 것
- 클래스는 다른 클래스 또는 외부 요소와 독립적으로 디자인해야 함
- 객체(Object)
- 클래스의 인스턴스로, 실제로 메모리상에 할당된 것
- 자신 공유의 속성을 가지며, 클래스의 정의된 행위를 수행
- 메소드(Method)
- 클래스로부터 생성된 객체를 사용하는 방법
- 메소드는 한 객체의 속성을 조작하는데에 사용
특징
- Abstraction(추상화): 자료 표현을 추상적으로 나타내는 추상 자료형을 사용한다.
- Polymorphism(다형성): 오버로딩과 오버라이딩을 하여 하나의 메소드명으로 다양한 동작을 구현할 수 있다.
- Inheritence(상속): 부모 클래스로부터 속성과 메소드를 상속받아 사용할 수 있다.
- Encapsulation(캡슐화): 사용자에게 불필요한 정보를 은닉/보호해야 한다.
객체 생성
1
2
3
4
5
6
7
8
9
class Car{ // 클래스 이름은 보통 PascalCase로 적는다.
int speed = 0; // 속성 or 멤버 변수
// 속성: Attribute, Field
// 멤버 변수: member variable
public void move(){ // 메소드 (method)
speed = 10; // 행위를 구현하며, 주로 속성을 변경한다.
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String args[]){
Car car = new Car(); // new 키워드로 클래스에서 객체 생성
System.out.println(car.speed); // .으로 속성 접근 가능
car.move(); // 메소드 호출
System.out.println(car.speed); // 10
Car car1 = new Car(); // 독립적인 새로운 객체 생성
System.out.println(car1.speed); // 0
Car car2 = car; // 참조형 객체. 새로운 객체를 만드는 것이 아니라 해당 값을 가리키기만 한다. car2->car
System.out.println(car2.speed); // 10
car2.speed = 5; // 참조형 객체이기 때문에 car의 speed 값도 같이 바뀐다.
System.out.println(car.speed); // 5
}
클래스와 객체의 메모리 구조
- 클래스 영역(Class area, method area, code area, static area)
- field 정보, method 정보, type 정보, constant pool이 저장된다.
- 스택 영역(Stack area)
- method 호출 시 선언된 로컬 변수가 저장된다.(임시로 있다가 사라짐)
- 힙 영역(Heap area)
- new 키워드로 생성된 객체가 저장된다.
- garbage collection이 동작하는 영역이다. -> 더이상 사용하지 않는 메모리를 알아서 반환하는 JVM의 기능
1 2 3 4 5 6 7 8 9 10
public class MemoryStructure_Class { // 클래스 영역 int x, y; // 힙 영역 String string = "문자열!!!"; // string 변수는 힙영역, "문자열!!!"은 constant pool에 저장된다. // string은 객체이므로 힙 영역에 string의 참조형 값이, constant pool에 데이터 값이 저장된다. // 객체가 생성되면서 변수도 같이 생성되므로 객체와 같이 힙영역에 저장된다. public void method(int value){ // 클래스 영역 value = 10;-> 스택 영역 char c = '='; // 스택 영역 } }
클래스에서 사용되는 변수의 종류
- 클래스 멤버 변수(static variable, class variable)
- 인스턴스 변수(member variable, attribute)
- 로컬 변수(local variable)
- 로컬 파라미터 변수(local parameter variable, argument)
- 사용 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Variable_Class {
static int classVar; // 클래스 멤버 변수. 별도로 초기화 하지 않으면 0으로 자동으로 초기화.
int instanceVar; // 인스턴스 멤버 변수. 별도로 초기화 하지 않으면 0으로 자동으로 초기화.
public void method(int paramVar){ // 로컬 파라미터 변수
System.out.println(paramVar); // 로컬 파라미터 변수 출력
int localVar; // 로컬 변수
//System.out.println(localVar); 로컬변수는 자동으로 초기화 되지 않기 때문에 초기화 하지 않은 상태에서는 출력 불가.
localVar = 10;
System.out.println(localVar); // 로컬 변수 출력
{
localVar = 10; // 상위 블록에서 선언 된 것은 하위 블록에서 변경 가능
int localVar2 = 20;
}
// localVar2 = 10; // 생명주기가 끝났으므로 접근 불가. 하위 블록에서 선언한 변수는 상위블록에서 사용할 수 없다.
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class VariableTest{
public static void main(String[] args) {
System.out.println("클래스 멤버 변수");
System.out.println(Variable_Class.classVar); // 클래스 변수는 클래스 이름으로 바로 접근 가능
Variable_Class.classVar = 5; // 클래스 이름으로 접근하여 값 변경도 가능
System.out.println(Variable_Class.classVar);
System.out.println("인스턴스 멤버 변수");
Variable_Class vr = new Variable_Class();
System.out.println(vr.instanceVar);
// Variable_Class.instanceVar 클래스 이름으로는 접근 불가.
vr.instanceVar = 20;
System.out.println(vr.instanceVar);
System.out.println(vr.classVar); // 클래스 변수는 객체에 할당되는 값이 아니기 때문에 가능하나 권장하지 않음.
System.out.println("로컬 변수");
vr.method(9);
}
}