객체지향 기본 이론
- '실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물 간의 상호작용이다.'
객체 지향 언어 특성
- 재사용성, 관리성 용이, 높은 신뢰성, 유연하고 변경에 용이하다.
객체 배열
- 객체 배열안에 객체가 저장되는 것이 아니라, 객체의 주소가 저장된다.
- 객체 배열은 참조변수들을 하나로 묶은 참조 변수 배열이다.
데이터 저장 형태 발전 과정
- 변수 → 배열 → 구조체 → 클래스 순으로 발전된다.
static 변수
- 인스턴스 변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장 공간을 공유해, 공통된 값을 가지게 된다.
메서드 사용 이유
- 높은 재 사용성, 중복된 코드 제거, 프로그램 구조화
※ void → 아무것도 없음을 뜻함
JVM 구조
- 메서드 영역, 힙, 호출 스택
- 메서드 영역
- 클래스 정보와 클래스 변수 생성
- 힙
- 인스턴스가 모두 생성, 인스턴스 변수들
- 호출 스택
- 메서드에 필요한 메모리 공간을 제공
- 지역변수, 연산의 중간 값 저장
- 작업을 마치면 비워짐
※ 호출 스택의 제일 상위 메서드가 현재 진행중인 메서드, 나머지는 대기 상태
- 기본형 매개변수는 단순히 값이 복사되지만, 참조형 매개변수는 주소가 복사된다.
- 기본형 매개변수는 읽기만 가능하고, 참조형 매개변수는 읽기, 쓰기가 가능하다.
- 배열도 객체와 같이 참조 변수를 통해서 데이터 접근
반환 타입이 참조형이라는 것은 메서드가 객체의 주소형을 반환한다는 뜻
재귀 호출
- 반복문은 그저 같은 문장을 반복해서 수행하지만
- 매개변수 복사와 종료 후 복귀할 주소저장등 추가 과정이 필요
→ 사용이유는? (논리적 간결함 때문)
클래스 메서드
- 클래스를 설계할 때, 공통으로 사용되는 번수를 static으로
- 클래스 변수는 인스턴스 없이 사용 가능
- 클래스 메서드는 인스턴스 변수를 사용할 수 없음
- 메서드 내에서 인스턴스 변수를 사용하지 않으면 static 고려
※정적 지역 변수는 JAVA에서 지원 X
※static은 변수와 메서드에만 정적으로 가능 class는 존재하지 않는다.
오버로딩
- 오버로딩 →메서드 이름이 같고 매개변수 개수 or 타입이 무조건 달라야함
- 타입만 바꾸면 컴파일러가 인식하지 못해 오류가 발생한다
- 장점 → 한 기능을 하는 메서드를 타입에 따라 다른 이름으로 만들지 않고 하나로 융통성이 있음
가변 인자와 오버로딩
- public void test(~~~,Object… args){} → 가변인자
- 가변 인자는 항상 마지막 매개 변수여야함
- 가변 인자는 내부적으로 배열을 이용하는 것
- 인자가 없어도 되고, 배열도 가능하다.
- 선언된 메서드를 호출할 때마다 배열이 새로 생성 → 성능에 비효율적
- 가변인자를 사용한 메서드는 오버로딩 하지 않는것이 좋다 / 구별이 안될 수 있음
생성자
- 인스턴스가 생성될 때 호출되는 ‘인스턴스 초기화 메서드’
- 연산자 new로 인스턴스를 생성하면 생성자로 값을 초기화한다
- 새로운 인스턴스를 생성하면 주소값이 반환됨
- 생성자를 따로 작성하지 않으면 컴파일러가 기본 생성자를 생성
- this(), this를 통해서 다른 생성자를 호출 가능 | this()는 항상 첫줄에 사용
변수의 초기화
- 지역변수는 사용하기 전에 반드시 초기화 필요
- 초기화 방법
- 명시적 초기화, 생성자, 초기화 블럭
초기화 블럭
- 클래스 초기화 블럭, 인스턴스 초기화 블럭
public class Main {
static {
System.out.println("static 초기화 블럭");
}
{
System.out.println("인스턴스 초기화 블럭");
}
public Main(){
System.out.println("생성자");
}
public static void main(String[] args) {
System.out.println("new Main");
Main m1 = new Main();
System.out.println("new Main2");
Main m2 = new Main();
}
}
결과 값 → 클래스 초기화 블럭하고 인스턴스가 생성되고 인스턴스 초기화 블럭 사용후 생성자가 호출된다.
정리
- 인스턴스 초기화 블럭 → 모든 생성자에서 공통으로 수행돼야하는 코드를 넣는데 사용
- 클래스 변수의 초기화 순서 : 기본 값 - 명시적 초기화 - 클래스 초기화 블럭
- 인스턴스 변수의 초기화 순서 : 기본 값 - 명시적 초기화 - 인스턴스 초기화 블럭 - 생성자
'Java > 자바의 정석' 카테고리의 다른 글
[자바의 정석] 5장 배열 (0) | 2023.09.27 |
---|---|
[자바의 정석] 4장 조건문과 반복문 (0) | 2023.09.26 |
[자바의 정석] 3장 연산자 (0) | 2023.09.25 |
[자바의 정석] 2장 변수 (0) | 2023.09.23 |