✔객체지향 프로그래밍(OOP)
0. OOP의 특징
◾ OOP is A P.I.E
1. Abstraction(추상화)
: 현실의 객체를 추상화하여 클래스 구성.
2. Polymorphism(다형성) : 하나의 객체를 여러 가지 타입(형)으로 참조.
3. Inheritance(상속) : 부모 클래스의 자산을 물려받아 자식을 정의함으로 코드의 재사용 가능.
4. Encapsulation(데이터 은닉과 보호) : 데이터를 외부에 직접 노출시키지 않고 메서드를 이용해 보호할 수 있다.
1. 객체지향 프로그래밍(Object Oriented Programming)
- 주변의 많은 것들을 객체화(추상화)하여 프로그래밍 하는 것.
- 객체 : 주체가 아닌 것. 주체가 활용하는 것.
- OOP의 장점 : 블록 형태의 모듈화된 프로그래밍
- 신뢰성 높은 프로그래밍 가능.
- 추가/수정/삭제 용이.
- 재사용성 높음.
- 현실 세계 객체, 클래스, 프로그램 객체의 관계
- 현실의 객체가 갖는 속성과 기능 : 추상화되어 클래스에 정의
- 클래스 구체화 -> 프로그램 객체(instance, object)
- 붕어빵 틀(Type 규정), 붕어빵(객체) : 설계도는 하나의 Type, 객체는 설계도를 통해 구현된 것.
- 프로그램의 클래스와 객체
- 클래스 : 객체를 정의해 놓은 것으로 설계도, 틀에 해당한다.
- 객체(instance, object) : 클래스를 데이터 타입으로 메모리에 생성된 것.(클래스의 구체화, 객체화)
- 객체는 모두 클래스에 선언된 속성을 공통적으로 가지지만 객체별로 다른 상태 값을 가진다.(다양하게 표현이 가능하다.)
- 클래스로 만든 객체는 참조형(Reference Type)
- JVM 메모리 구조 : Class Area, Method Stack, Heap
- Class Area : 클래스 원형 로딩
- Filed 정보
- Method 정보
- 타입 정보
- Constant Poll
- Method Stack : 메서드들의 실행 공간
- Thread별 관리
- 메서드 호출 순서대로 쌓이는 구조
- 메서드 프레임에 각 로컬 변수도 쌓이는 구조
- 로컬 변수는 선언된 영역을 벗어나면 삭제
- Heap : 객체를 저장하기 위한 영역
- Thread에 의해 공유
- 생성된 객체는 프로그래머가 삭제할 수 없음 => Garbage Collection만이 제어 가능
2. 메서드(Method)
- 메서드(Method) : 객체와 관련된 서브 루틴 (또는 함수)이자 클래스가 갖고 있는 기능.
- 메서드 정의의 필요성
- 메서드가 없다면 필드(멤버 변수)에 접근하기 위해 항상 코드 새로 작성해야한다.
- 메서드를 통해 모듈화로 필요한 작업 반복 실행 가능하다.
- 선언부 :
리턴_타입 메서드명(파라미터){코드}
- 리턴 타입(Return Type) : 호출 결과 호출한 곳으로 반환되는 값의 타입.(반환값이 없다면 void.)
- 리턴 타입은 하나만 적용 가능.
- 결과를 받을 때 Promotion(묵시적 형 변환) 가능.
- 메서드명 : 메서드가 수행하는 작업을 쉽게 파악하도록 의미있는 이름 사용.
- 파라미터 : 메서드 호출 시점에 필요한 변수들. 없을 경우 생략
- 파라미터 전달 시 Promotion(묵시적 형 변환) 허용
- Variable arguments : 메서드 선언 시 몇 개의 인자가 들어올지 예상할 수 없는 경우(또는 가변적).
- 배열 타입 선언도 가능하지만 메서드 호출 전 배열 생성 및 초기화 과정이 필수로 번거롭다.
...
을 이용해 파라미터 선언 -> 호출시 넘겨준 값의 개수에 따라 자동으로 배열 생성 및 초기화.
int test(int... nums){
int sum = 0;
for (int num : nums){
sum += num;
}
return sum;
}
void test(int num){
System.out.println(num);
}
void test(String name, int num){
System.out.println(name + " : " + num);
}
3. 생성자(Constructor)
- 생성자(Constructor) : new 연산자를 통해서 인스턴스를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 메소드.
- 멤버 변수 초기화, 객체 생성시 실행되어야하는 작업 실행을 위해 사용.
- 생성자 작성 규칙
- 메서드와 비슷하나 리턴 타입이 없고 이름은 클래스 이름과 동일.
- 생성자의 종류
- 기본 생성자(Default Constructor) :
메서드명(){}
- 파라미터가 없고 구현부가 비어있는 형태.
- 생성자 코드가 없으면 컴파일러가 기본 제공
- 파라미터가 있는 생성자 :
메서드명(파라미터){ 코드 }
- 일반 멤버 변수의 초기화 -> 생성자 호출시 파라미터를 통해 초기화
- 파라미터가 있는 생성자 구현시 기본 생성자가 자동 생성되지 않음.(상황에 따라 오버로딩 필요.)
class Test(){
Test(){
System.out.println("기본 생성자가 호출되었습니다.");
}
Test(int num){
System.out.println("파라미터 : "+num+"이 전달되었습니다.);
}
}
this
: 참조 변수로 객체 자신을 의미하는 키워드.
- 참조 변수를 통해 객체 멤버에 접근하는 것처럼 this를 이용해 자신의 멤버에 접근 가능.
- 로컬 변수와 멤버 변수의 이름이 동일할 경우 멤버 변수임을 명시적으로 표현할 때 사용.
- 객체에 대한 참조이므로 static 영역에서는 사용 불가.
this()
: 객체 자신의 생성자를 의미하는 키워드.
- 객체 생성시 필요한 멤버 변수 초기화 -> 생성자별 중복 코드 발생.
- 한 생성자에서 다른 생성자 호출시 사용하여 중복 해소.
- 반드시 생성자 블록의 첫 줄에서만 호출 가능.