[자바의정석]Chapter 06. 객체지향 프로그래밍I

seungwon·2023년 1월 9일
0

자바의 정석

목록 보기
6/14

1. 객체지향 언어

1.1 객체지향언어의 역사

객체지향이론의 기본 개념 : 실제 세계는 사물(객체)로 이루어져 있으며,발생하는 모든 사건들은 사물간의 상호작용이다.
<-> 절차적 언어 : FORTRAN, COBOL

1.2 객체지향언어

재사용성, 유지보수, 중복 코드 제거

  1. 코드의 재사용성이 높다.

  2. 코드의 관리가 용이하다.

  3. 신뢰성이 높은 프로그래밍을 가능하게 한다.
    데이터 보호(제어자와 메서드를 이용), 코드의 불일치로 인한 오동작 방지(코드의 중복 제거)


2. 클래스 & 객체

  • 클래스 : 객체를 정의해 놓은 것
  • 객체 : 클래스의 정의된 내용대로 메모리에 생성된 것 (실제로 존재하는 것 - 유형+무형), 멤버 변수+메서드

인스턴스화 : 클래스 -> 객체 만드는 과정
인스턴스 : 어떤 클래스로부터 만들어진 객체

클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); 

접근 : 참조변수.멤버변수(메서드)

2.5 객체 배열

Tv[] tvArr = new Tv[3]; // 길이가 3인 Tv타입의 참조변수 배열


// 객체를 생성해서 배열의 각 요소에 저장 
tvArr[0] = new Tv(); 
tvArr[1] = new Tv(); 
tvArr[2] = new Tv();
//Tv[] tvArr = { new Tv(), new TV (), new Tv() };

2.6 클래스의 또 다른 정의

  1. 데이터와 함수의 결합
  2. 사용자정의 타입(User-defined type)

3. 변수와 메서드

3.1 선언위치에 따른 변수의 종류

변수의 종류선언위치생성시기기타
클래스 변수 \\ (Class variable)클래스 영역클래스가 메모리에 올라갈 때 \\(인스턴스 생성전에도 접근 가능) \qquad선언 : 변수 앞에 static을 붙임 \\ 접근 : 클래스명(인스턴스명).변수명, 전역변수(public)의 성격
인스턴스 변수 \\ (Instance variable)클래스 영역인스턴스가 생성되었을 때
지역변수 \\ (local variable)클래스 영역 이외의 영역 \\ (메서드, 생성자, 초기화 블럭 내부)변수 선언문이 수행되었을 때

3.3 메서드

메서드 사용 이유

  1. 높은 재사용성(reusability)
  2. 중복된 코드의 제거
  3. 프로그램의 구조화

3.7 JVM의 메모리 구조

응용프로그램 실행 -> JVM이 시스템으로부터 메모리 할당 받음 -> 메모리를 용도에 따라 여러 영역으로 나누어 관리 & 프로그램 수행

  • method area
  • call stack
  • heap

  1. 메서드 영역(method area) : 클래스 데이터(클래스에 대한 정보) + 클래스 변수
  2. 힙(heap) : 인스턴스(인스턴스 변수)
  3. 호출 스택(call stack 또는 execution stack) : 메서드의 작업에 필요한 메모리 공간, \\ 메서드가 작업을 마치면 할당되었던 메모리 공간은 반환되어 비워짐, 스택구조(현재 수행중인 메서드 : 가장 위에 위치)
    • 지역변수(매개변수)
    • 연산의 중간결과 저장

3.8 기본형 매개변수와 참조형 매개변수

  • 기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.(read only)
  • 참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다. (read & write) - 매개변수에 주소가 복사됨

3.11 클래스 메서드(static메서드)와 인스턴스 메서드

  • 인스턴스 메서드 : 인스턴스 변수와 관련된 작업을 하는 메서드
    • 같은 클래스내의 다른 인스턴스 메서드/변수 호출 가능
    • static 메서드/클래스변수 사용 가능
  • 클래스 메서드(static메서드) : 인스턴스와 관계없는(인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드
    • 인스턴스 사용 불가능
    • 같은 클래스내의 다른 인스턴스 변수/메서드 사용/호출 불가능
    • static 메서드/클래스 변수 사용 가능

cf. 참조변수 선언 + 인스턴스 메서드 호출 한번에!

MemberCall c = new MemberCall();
int result = c.instanceMethodl();

⬇️

int result = new MemberCall().instanceMethodl();

4. 오버로딩(overloading)

= 메서드 오버로딩(method overloading)
한클래스 내에 같은이름의 메서드를 여러 개 정의하는 것

4.2 오버로딩의 조건

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.

주의할 예시

long add(int a, long b) { return a+b; } // 오버로딩ㅇ
long add(long a, int b) { return a+b; } // 오버로딩ㅇ

4.4 오버로딩의 장점

  • 같은 기능을 하는 메서드를 하나의 이름으로 사용 가능
    -> 메서드를 사용하는 입장에서 편함, 이름으로 기능 유추 가능
  • 메서드의 이름을 절약할 수 있음

4.5 가변인자

기존에는 메서드의 매개변수 개수가 고정적이었으나 JDK1.5부터 동적으로 지정해 줄 수 있게 하는 기능

타입... 변수명
항상 마지막 매개변수이어야 함, 아예 생략 가능
내부적으로는 배열이 생성됨

ex) public PrintStream printf(String format, Object... args) { ... }
: 매개변수의 개수 >=>= 1개


5. 생성자

인스턴스가 생성될 때 호출되는 ‘인스턴스 초기화 메서드’
(연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것x)

조건

  1. 생성자의 이름은 클래스의 이름과 같아야 한다.
  2. 생성자는 리턴 값이 없다.(void도 쓰지 않음)

종류

  1. 기본 생성자(default constructor)
    기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이다.
  2. 매개변수가 있는 생성자

등등

5.4 생성자에서 다른 생성자 호출하기 - this(), this

☑️ this : 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다. 모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다.
☑️ this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.

  • 생성자의 이름으로 클래스이름 대신 this를 사용한다.
  • 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

ex)

class Car {
    String color; // 색상
    StringgearType; //변속기 종류 一auto(자동),manual(수동) 
    int door; // 문의 개수
    Car() {
        this("white", "auto", 4); 
    }
    Car(String color) {
        this(color, "auto", 4);
    }
    Car(String color, String gearType, int door) { 
        this.color = color;
        this.gearType = gearType;
        this.door = door;
    }
}  

cf. static메서드(클래스 메서드) 에서는 인스턴스 멤버들을 사용할 수 없는 것처럼, ‘this’ 역시 사용할 수 x


6. 변수의 초기화

6.1 변수의 초기화

멤버변수의 초기화 방법

생성자보다 인스턴스 초기화 블력이 먼저 수행된다 \\(클래스 로드 -> 클래스 변수들이 자동으로 메모리에 만들어어짐 -> 초기화 블럭이 클래스 변수 초기화)

  1. 명시적 초기화(explicit initialization)
  2. 생성자(constructor)
  3. 초기화 블럭 (initialization block)
    • 인스턴스 초기화 블럭 : 인스턴스변수를 초기화 하는데 사용. { }
      • 클래스의 모든 생성자에 공통으로 수행되어야 하는 문장
    • 클래스 초기화 블럭 : 클래스변수를 초기화 하는데 사용. static{ }

ex)

class InitBlock {
	static {
    	// 클래스 초기화 블럭
    }
	{
    	// 인스턴스 초기화 블럭
    }
    // ...
}

6.4 클래스변수의 초기화시점 인스턴스변수의 초기화시점

초기화 시점초기화순서
클래스 변수클래스가 처음 로딩될 때 단 한번기본값 -> 명시적초기화 -> 클래스 초기화 블럭
인스턴스 변수인스턴스가 생성될 때마다 각 인스턴스별로 초기화기본값 -> 명시적초기화 -> 인스턴스 초기화 블럭 -> 생성자

cf. 클래스의 로딩 시기는 JVM의 종류에 따라 좀 다를 수 있음
클래스가 필요할 때 바로 메모리에 로딩하도록 설계 가 되어있는 것도 있고. 실행효율을 높이기 위해서 사용될 클래스들을 프로그램이 시작될 때 미리 로딩하도록 되어있는 것도 있다.

1개의 댓글

comment-user-thumbnail
2023년 12월 8일

I love that you told me about this piece; I really enjoy reading it. I was really hoping to find that, and I really hope you keep posting such great information in the years to come. foodle

답글 달기