본문 바로가기

TIL(Today I Learned)

TIL-230916(자바의정석 Chapter06 '객체지향 프로그래밍1')

📝오늘 공부한 것

  • 자바의 정석 3판 Chapter 06 객체지향 프로그래밍1

 

📌 자바의 정석 스터디

월요일부터 자바의 정석 스터디를 진행하기로 했다.
6장부터 시작하여 월, 수, 금 일주일에 3번 한 챕터씩 진행할 것이다.

 

[ 객체지향언어 ]

  1. 코드의 재사용성이 높음.
  2. 유지보수가 용이함.
  3. 신뢰성이 높은 프로그래밍을 가능하게 함.

 

[ 클래스와 객체 ]

클래스와 객체의 정의와 용도

클래스의 정의 : 클래스란 객체를 정의해 놓은 것

클래스의 용도 : 클래스는 객체를 생성하는데 사용

객체의 정의 : 실제로 존재하는 것. 사물 또는 개념

객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름

 

객체와 인스턴스

객체 : 모든 인스턴스를 대표하는 포괄적인 의미

인스턴스 : 어떤 클래스로부터 만들어진 객체

클래스 —-(인스턴스화)→ 인스턴스(객체)

 

객체의 구성요소

속성과 기능으로 이루어져 있다.

속성(property) - 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)

기능(function) - 메서드(method), 함수(function), 행위(behavior)

 

인스턴스의 생성과 사용

인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.

 

[ 변수와 메서드 ]

변수의 종류 선언 위치 생성시기
클래스 변수 클래스 영역 클래스가 메모리에 올라갈 때
인스턴스 변수 인스턴스가 생성되었을 때
지역변수 클래스 영역 이외의 영역 변수 선언문이 수행되었을 때

 

매개변수의 유효성 검사

메서드의 구현부를 작성할 때, 제일 먼저 해야하는 일이 매개변수의 값이 적절한 것인지를 확인하는 것!

→ 타입만 맞으면 어떤 값도 매개변수를 통해 넘어올 수 있기 때문에, 가능한 모든 경우의 수에 대해 고민하고 그에 대비한 코드를 작성해야함.

 

JVM의 메모리 구조

  1. 메서드 영역 (method area) :
    클래스 데이터 저장. 그 클래스 변수도 이 영역에 함께 생성
  2. 힙 (heap) :
    인스턴스가 생성되는 공간
  3. 호출 스택 (call stack / execution stack) :
    메서드 작업에 필요한 메모리 공간을 제공

 

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

기본형 매개변수 : read only / 저장된 값을 알수 있음.

참조형 매개변수 : read & write / 저장된 곳의 주소를 알 수 있음.

 

재귀호출

속도가 느리고, stackoverflow가 발생할 수 있음. 적절히 사용하면 괜찮다고 한다.

하지만, 아직 잘 모르니 사용하는 걸 조심하자!!

 

클래스 메서드와 인스턴스 메서드

클래스의 멤벼변수 중 모든 인스턴스에 공통된 값을 유지야해하는 것이 있는지 살펴보고, 있으면 static을 붙여준다.

작성한 메서드 중에서 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드에 static을 붙일 것을 고려한다.

 

[ 오버로딩 ]

한 클래스 내에 같은 이름의 메서드를 여러개 정의하는 것

 

조건 :

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  3. 반환타입은 상관없음

[ 생성자 ]

인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드

 

조건 :

  1. 생성자의 이름은 클래스의 이름과 같아야 한다.
  2. 생성자는 리턴값이 없다.

[ 변수의 초기화 ]

멤버변수와 배열의 초기화는 선택적 / 지역변수의 초기화는 필수적

 

멤버변수의 초기화 방법

  1. 명시적 초기화(explixit initialization)
     - 변수선언과 동시에 초기화 다른 방법들 중 가장 우선적으로 고려
  2. 생성자
  3. 초기화 블럭 
     - 생성자 보다 인스턴스 초기화 블럭이 먼저 수행됨

멤버변수의 초기화 시기와 순서

클래스 변수의 초기화 시점 : 클래스가 처음 로딩될 때 단 한번

인스턴스 변수의 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스별로

클래스 변수 초기화순서 : 기본값 → 명시적 초기화 → 클래스 초기화 블럭

인스턴스 변수 초기화순서 : 기본값 → 명시적 초기화 → 인스턴스 초기화 블럭 → 생성자

 

개선할 점💪🏻

개념서를 읽으면 아는 내용들도 코드를 작성할 때 적용하기 어려운 것 같다.

앞으로는 코드들 작성할 때 배운 내용들을 적용하면서 해봐야겠다.

그리고 아직 개념을 완전히 이해한 것이 아니라서 정리를 하다보면 나의 말로 적는 것이 아니라 개념서 요약이 되어버린다. 단순히 요점정리가 아닌 나의말로 내가 이해한 것들을 적을 수 있도록 늘려가야겠다.