본문 바로가기

Java/자바의 정석

[자바의정석] 6장 객체 지향 프로그래밍 1

객체지향 기본 이론

  • '실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물 간의 상호작용이다.'

객체 지향 언어 특성

  • 재사용성, 관리성 용이, 높은 신뢰성, 유연하고 변경에 용이하다.

객체 배열

  • 객체 배열안에 객체가 저장되는 것이 아니라, 객체의 주소가 저장된다.
  • 객체 배열은 참조변수들을 하나로 묶은 참조 변수 배열이다.

데이터 저장 형태 발전 과정

  • 변수 → 배열 → 구조체 → 클래스 순으로 발전된다.

static 변수

  • 인스턴스 변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장 공간을 공유해, 공통된 값을 가지게 된다.

메서드 사용 이유

  • 높은 재 사용성, 중복된 코드 제거, 프로그램 구조화

※ void → 아무것도 없음을 뜻함

JVM 구조

  • 메서드 영역, 힙, 호출 스택
  1. 메서드 영역
    • 클래스 정보와 클래스 변수 생성
    • 인스턴스가 모두 생성, 인스턴스 변수들
  2. 호출 스택
    • 메서드에 필요한 메모리 공간을 제공
    • 지역변수, 연산의 중간 값 저장
    • 작업을 마치면 비워짐

※ 호출 스택의 제일 상위 메서드가 현재 진행중인 메서드, 나머지는 대기 상태

  • 기본형 매개변수는 단순히 값이 복사되지만, 참조형 매개변수는 주소가 복사된다.
  • 기본형 매개변수는 읽기만 가능하고, 참조형 매개변수는 읽기, 쓰기가 가능하다.
    • 배열도 객체와 같이 참조 변수를 통해서 데이터 접근

반환 타입이 참조형이라는 것은 메서드가 객체의 주소형을 반환한다는 뜻

재귀 호출

  • 반복문은 그저 같은 문장을 반복해서 수행하지만
  • 매개변수 복사와 종료 후 복귀할 주소저장등 추가 과정이 필요

→ 사용이유는? (논리적 간결함 때문)

클래스 메서드

  1. 클래스를 설계할 때, 공통으로 사용되는 번수를 static으로
  2. 클래스 변수는 인스턴스 없이 사용 가능
  3. 클래스 메서드는 인스턴스 변수를 사용할 수 없음
  4. 메서드 내에서 인스턴스 변수를 사용하지 않으면 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