객체지향 프로그래밍(OOP)이란?
주변의 많은 것들을 객체화 해서 프로그래밍 하는 것
OOP의 장점
블록 형태의 모듈화된 프로그래밍
- 신뢰성 높은 프로그래밍이 가능하다.
- 추가/수정/삭제가 용이하다.
- 재 사용성이 높다.
Class vs Object
현실의 객체 --(추상화)--> 클래스 // 현실의 객체의 속성과 기능은 추상화 되어 클래스에 정의됨
클래스 --(구체화)--> 프로그램의 객체 // 클래스는 구체화되어 프로그램의 객체(instance, object)가 됨.
클래스 : 객체를 정의해 놓은 것, 즉, 객체의 설계도
객체 : 클래스를 데이터 타입으로 메모리에 생성되어 실제로 동작하는 것
JVM 메모리 구조
meta-space
클래스 정보처리
타입 정보, field 정보, method 정보
stack
메서드들의 실행 공간
thread 별로 별도 관리
메서드 호출 시 마다 메서드 프레임 적층
프레임에 로컬변수도 쌓이는 구조
heap
객체를 저장하기 위한 영역
thread에 의해 공유
객체가 생성되고 G.C에 의해 정리됨
상수 풀
위치에 따른 변수의 종류
타입에 따른 분류 : primitive/reference type
선언 위치에 따른 변수 : 멤버 변수, 지역 변수
인스턴스 멤버 변수의 특징
클래스 {} 영역에 선언
객체가 만들어질 때 heap에 객체 별로 생성됨
객체 이름으로 접근
GC에 의해 객체가 없어질 때 소멸
클래스 멤버 변수의 특징
클래스 {} 영역에 static 키워드를 붙여서 선언
클래스 로더에 의해 클래스가 로딩 될 때 heap에 클래스 별로 생성됨
객체와 무관하게 클래스 이름으로 접근
(객체 이름으로도 접근은 가능하나 static에 부합한 표현은 아니다)
클래스가 언로드 될 때 GC 발생
지역 변수 & 파라미터 변수
클래스 영역의 {} 이외의 모든 중괄호 안에 선언되는 변수들
선언된 라인이 실행될 때 stack의 메서드 프레임 내부에 생성됨
사용하기 전 명시적 초기화 필요
선언된 영역을 벗어날 때 소멸
메서드
메서드란? 현실의 객체가 하는 동작을 프로그래밍화
이를 통해 코드 중복방지, 유지 보수에 용이
기본 선언
제한자 리턴타입 메서드이름(타입 변수명 ....){
}
variable arguments
메서드 선언 시 동일 타입의 인자가 몇 개 들어올 지 알 수 없는 경우
배열타입을 선언하면 사용이 번거롭다
... 키워드를 이용해 선언하면 호출 시
넘겨준 값의 개수에 따라 자동으로 배열 생성 및 초기화
public int sum(int... params){
int sum = 0;
for(int num : params)
sum += num;
return sum;
}
메서드 호출
static/non-static 상태를 구분해서 호출
static의 경우 바로 사용이 가능하나, non-static의 경우 객체를 만들고 접근해야 한다
**자바는 call by value만 존재한다. call by reference가 아님.**
메서드의 인자로 전달되는 value가 primivite형인지 reference형인지 파악하는 것이 중요
메서드 오버로딩
동일한 기능을 수행하는 메서드의 추가 작성
서로 다른 인자에 대해서 동일한 기능을 수행할 수 있다.
기억해야 할 메서드가 감소하고 중복 코드에 대한 효율적 관리 가능
메서드의 이름은 동일하고 파라미터의 개수 또는 순서, 타입이 달라야 함