오늘은 개발과 커밋 자세히보기

프로그래밍 공부/Java

[ Java 프로그래밍 ] 공부 정리 - 4강. 클래스와 객체

호크테마 2023. 4. 30. 14:31

* 공부 정리일자 (2022년 8~12월) 
- 책 : 명품 자바 에센셜 
- 개인적으로 공부 및 복습하면서 정리한 내용입니다. (사진 제외) 

 


* 목차
4장. 클래스와 객체 (책 133p)
4.1 객체 지향과 자바 (책 133p)
4.2 자바 클래스 만들기 (책 139p)
4.3 생성자 (책 144p)
4.4 객체 배열 (책 153p)
4.5 메소드 활용과 객체 치환 (책 157p)
4.6 객체의 소멸과 가비지 컬렉션 (책 164p)
4.7 접근 지정자 (책 167p) 
4.8 static 멤버 (책 172p)
4.9 final (책 176p) 


1. 복습 (중요 키워드 위주)
4) 4강. 클래스와 객체 (책 133p)
4.1) 객체 지향과 자바 

(1) 세상 모든 것이 객체다
- 세상 모든 것이 객체다. (온 세상이 객체다.)

* 실세계 객체의 특징
- 객체마다 고유한 특성(state)와 행동(behavior)를 가짐
- 다른 객체들과 정보를 주고 받는 등, 상호작용하면서 살아감

* 컴퓨터 프로그램에서 객체 사례
- 테트리스 게임의 각 블록들
- 한글 프로그램의 메뉴나 버튼들

(2) 자바의 객체 지향 특성 - 캡슐화
캡슐화  
- 객체를 캡슐로 싸서 내부를 볼 수 없게 하는 것
- 객체의 가장 본질적인 특징
-- 외부의 접근으로부터 객체 보호

* 자바의 캡슐화
- 클래스 (class) 
-- 객체 모양을 선언한 틀 (캡슐화하는 틀)

- 객체  
-- 생성된 실체 (instance)
-- 클래스 내에 메소드와 필드 구현

* 자바에서 클래스로 객체 캡슐화 

(3) 자바의 객체 지향 특성 – 상속 (inheritance)
상속
- 상위 개체의 속성이 하위 개체에 물려짐
- 하위 개체가    상위 개체의 속성을 모두 가지는 관계

* 실세계의 상속 사례
- 나무는 식물의 속성과 생물의 속성을 모두 가짐
- 사람은 생물의 속성은 가지지만 식물의 속성은 가지고 있지 않음

* 자바 상속 
- 상위 클래스의 멤버를 하위 클래스가 물려받음
-- 상위 클래스 : 수퍼 클래스
-- 하위 클래스 : 서브 클래스, 
                  수퍼 클래스 코드의 재사용, 
                  새로운 특성 추가 가능

* Animal 클래스를 상속받은 Human 클래스와 객체 관계


(4) 자바의 객체 지향 특성 – 다형성
* 다형성 (polymorphism)
- 같은 이름의 메소드가 
   클래스 혹은 객체에 따라 다르게 구현되는 것

* 다형성 사례
- 메소드 오버로딩 
-- 한 클래스 내에서 같은 이름이지만 다르게 작동하는 여러 메소드

- 메소드 오버라이딩 
-- 슈퍼 클래스의 메소드를 동일한 이름으로 서브 클래스마다 다르게 구현


(5) 객체 지향 언어의 목적
(5.1) 소프트웨어의 생산성 향상
* 컴퓨터 산업 발전에 따라 소프트웨어의 생명 주기(life cycle) 단축
- 소프트웨어를 빠른 속도로 생산할 필요성 증대

* 객체 지향 언어
상속, 다형성, 객체, 캡슐화 등 소프트웨어 재사용을 위한 여러 장치 내장
- 소프트웨어 재사용과 부분 수정 빠름
- 소프트웨어를 다시 만드는 부담 대폭 줄임
- 소프트웨어 생산성 향상

(5.2) 실세계에 대한 쉬운 모델링
* 초기 프로그래밍
- 수학 계산/통계 처리를 하는 등 처리 과정, 계산 절차 중요

* 현대 프로그래밍
- 컴퓨터가 산업 전반에 활용
- 실세계에서 발생하는 일을 프로그래밍
- 실세계에서는 절차나 과정보다 물체(객체)들의 상호 작용으로 묘사하는 것이 용이

* 객체 지향 언어
- 실세계의 일을 보다 쉽게 프로그래밍하기 위한 객체 중심적 언어

(6) 절차 지향 프로그래밍과 객체 지향 프로그래밍
* 절차 지향 프로그래밍
- 작업 순서를 표현하는 컴퓨터 명령 집합
- 함수들의 집합으로 프로그램 작성

* 객체 지향 프로그래밍
- 컴퓨터가 수행하는 작업을 객체들간의 상호 작용으로 표현
- 클래스 혹은 객체들의 집합으로 프로그램 작성

(7) 클래스와 객체
* 클래스
- 객체의 속성(state)과 행위(behavior) 선언
- 객체의 설계도 혹은 틀

* 객체
- 클래스의 틀로 찍어낸 실체
- 프로그램 실행 중에 생성되는 실체
- 메모리 공간을 갖는 구체적인 실체
- 인스턴스(instance)라고도 부름

* 사례
- 클래스 : 소나타자동차,  객체 : 출고된 실제 소나타 100대
- 클래스 : 벽시계,  객체 : 우리집 벽에 걸린 벽시계들 
- 클래스 : 책상,  객체 : 우리가 사용중인 실제 책상들

 클래스 : 붕어빵 틀은 클래스 
 객체 : 틀의 형태로 구워진 붕어빵
- 치즈붕어빵, 크림붕어빵, 앙코붕어빵 등
ex) 사람을 사례로 든 클래스와 객체 사례


4.2) 자바 클래스 만들기 (책 139p)

(1) 자바 클래스 구성
* 클래스
- class 키워드로 선언

- 멤버 : 클래스 구성 요소
-- 필드(멤버 변수)와 메소드(멤버 함수)

- 클래스에 대한 public 접근 지정 
-- 다른 모든 클래스에서 클래스 사용 허락

- 멤버에 대한 public 접근 지정 
--  다른 모든 클래스에게 멤버 접근 허용

* 예제 4-1 : Circle 클래스의 객체 생성 및 활용

(2) 객체 생성과 활용

(2.1) 레퍼런스 변수 선언
    Circle pizza;

(2.2) 객체 생성
   - new 연산자 이용
    pizza = new Circle();

(2.3) 객체 멤버 접근
   - 점(.) 연산자 이용
    pizza.radius = 10;
    area = pizza.getArea();

* 예제 4-2 : Rectangle 클래스 만들기 연습
 너비(width)와 높이(height) 필드, 그리고 면적 값을 제공하는 getArea() 메소드를 가진 Rectangle 클래스를 작성하라.


4.3) 생성자 (책 144p)

(1) 생성자 개념과 목적
* 생성자
- 객체가 생성될 때 초기화 목적으로 실행되는 메소드
- 객체가 생성되는 순간에 자동 호출

* 예제 4-3 : 두 개의 생성자를 가진 Circle 클래스
- 두 개의 생성자를 가진 Circle 클래스를 만들어 보라.

(2) 생성자 작성 및 활용 - 생성자의 특징 
* 생성자 이름은 클래스 이름과 동일
* 생성자는 여러 개 작성 가능(생성자 중복)

* 생성자는 객체 생성시 한 번만 호출
- 자바에서 객체 생성은 반드시 new 연산자로 함

* 생성자의 목적은 객체 생성 시 초기화
* 생성자는 리턴 타입을 지정할 수 없음

(2.1) 생성자 선언 및 호출 연습
* 제목과 저자를 나타내는 title과 author 필드를 가진 Book 클래스를 작성하고, 생성자를 작성하여 필드를 초기화하라.

(3) 기본 생성자 (default constructor)
* 기본 생성자
- 매개 변수 없고, 아무 작업 없이 단순 리턴하는 생성자

* 디폴트 생성자라고도 불림

(3.1) 기본 생성자가 자동 생성되는 경우
- 클래스에 생성자가 하나도 선언되어 있지 않을 때
- 컴파일러에 의해 기본 생성자 자동 생성

(3.2) 기본 생성자가 자동 생성되지 않는 경우
- 클래스에 생성자가 선언되어 있는 경우
-- 컴파일러는 기본 생성자를 자동 생성해 주지 않는다.

(4) this 레퍼런스
* this
- 객체 자신에 대한 레퍼런스
-- 컴파일러에 의해 자동 관리, 개발자는 사용하기만 하면 됨
-- this.멤버 형태로 멤버를 접근할 때 사용

* 객체 속에서의 this
* this 요약

(5) this()로 다른 생성자 호출
* this()
- 같은 클래스의 다른 생성자 호출
- 생성자 내에서만 사용 가능
- 생성자 코드의 제일 처음에 있어야 함

- this() 사용 실패 사례

(5.1) 예제 4-5 this()로 다른 생성자 호출
- 예제 4-4에서 작성한 Book 클래스의 생성자를 this()를 이용하여 수정하라.


4.4) 객체 배열 (책 153p)
(1) 자바의 객체 배열
- 객체에 대한 레퍼런스 배열임

* 자바의 객체 배열 만들기 3 단계
 배열 레퍼런스 변수 선언
 레퍼런스 배열 생성
 배열의 각 원소 객체 생성

(2) 객체 - 배열 선언과 생성 과정 / 배열의 원소 객체 접근 
(2.1) 예제 4-6 : Circle 배열 만들기
- Circle 객체 5개를 가지는 배열을 생성하고, Circle 객체의 반지름을 0에서 4까지 각각 지정한 후, 면적을 출력하라.

(2.2) 예제 4-7 : 객체 배열 만들기 연습
- 예제 4-4의 Book 클래스를 활용하여 
   2개짜리 Book 객체 배열을 만들고,
   사용자로부터 책의 제목과 저자를 입력 받아 배열을 완성하라.


4.5) 메소드 활용과 객체 치환 (책 157p)
(1) 메소드 형식
* 메소드
- 메소드는 C/C++의 함수와 동일 
- 자바의 모든 메소드는 반드시 클래스 안에 있어야 함(캡슐화 원칙)

* 메소드 형식

* 접근 지정자
- 다른 클래스에서 메소드를 접근할 수 있는지 여부 선언
- public. private, protected, 디폴트(접근 지정자 생략)

* 리턴 타입
- 메소드가 리턴하는 값의 데이터 타입

(2) 인자 전달 : ‘값에 의한 호출’ 
(2.1) 인자 전달 – 기본 타입의 값이 전달되는 경우
- 매개 변수가 byte, int, double 등 기본 타입으로 선언되었을 때
-- 호출자가 건네는 값이 매개 변수에 복사되어 전달. 실인자 값은 변경되지 않음

(2.2) 인자 전달 – 객체가 전달되는 경우
- 객체의 레퍼런스만 전달 
-- 매개 변수가 실인자 객체 공유

(2.3) 인자 전달 – 배열이 전달되는 경우
* 배열 레퍼런스만 매개 변수에 전달
- 배열 통째로 전달되지 않음

* 객체가 전달되는 경우와 동일
- 매개 변수가 실인자의 배열 공유

(2.4) 예제 4-8 : 인자로 배열이 전달되는 예
- char[] 배열을 전달받아 배열 속의 공백(' ') 문자를 ','로 대치하는 메소드를 작성하라.

(3) 메소드 오버로딩
* 오버로딩(Overloading)
- 한 클래스 내에서 두 개 이상의 이름이 같은 메소드 작성
-- 메소드 이름이 동일하여야 함
-- 매개 변수의 개수가 서로 다르거나, 타입이 서로 달라야 함
-- 리턴 타입은 오버로딩과 관련 없음

(3,1) 성공한 오버로딩과 메소드 호출

(3.2) 오버로딩 실패 사례

(4) 객체 치환시 주의할 점
* 객체 치환은 객체 복사가 아니며, 레퍼런스의 복사이다.


4.6) 객체 소멸 (책 164p)
(1) 객체 소멸
- new에 의해 할당 받은 객체와 배열 메모리를 자바 가상 기계로 되돌려 주는 행위
- 소멸된 객체 공간은 가용 메모리에 포함

* 자바에서 사용자 임의로 객체 소멸안됨
- 자바는 객체 소멸 연산자 없음
-- 객체 생성 연산자 : new

- 객체 소멸은 자바 가상 기계의 고유한 역할

- 자바 개발자에게는 매우 다행스러운 기능
-- C/C++에서는 할당 받은 객체를 개발자가 프로그램 내에서 삭제해야 함
-- C/C++의 프로그램 작성을 어렵게 만드는 요인
-- 자바에서는 사용하지 않는 객체나 배열을 돌려주는 코딩 책임으로부터 개발자 해방

(2) 가비지
* 가비지
- 가리키는 레퍼런스가 하나도 없는 객체
-- 더 이상 접근할 수 없어 사용할 수 없게 된 메모리

* 가비지 켈렉션
- 자바 가상 기계의 가비지 컬렉터가 자동으로 가비지 수집, 반환

(2.1) 예제 4-9 : 가비지의 발생
- 다음 소스에서 언제 가비지가 발생하는지 설명하라.


(3) 가비지 컬렉터 (garbage collector)
* 가비지 컬렉션
- 자바 가상 기계가 가비지 자동 회수
-- 가용 메모리 공간이 일정 이하로 부족해질 때
-- 가비지를 수거하여 가용 메모리 공간으로 확보
- 가비지 컬렉터(garbage collector)에 의해 자동 수행

(4) 강제 가비지 컬렉션 강제 수행
- System 또는 Runtime 객체의 gc() 메소드 호출

-- 이 코드는 자바 가상 기계에 강력한 가비지 컬렉션 요청
-- 그러나 자바 가상 기계가 가비지 컬렉션 시점을 전적으로 판단


4.7) 접근 지정자 (책 167p)
(1) 자바의 패키지 개념
* 패키지
- 상호 관련 있는 클래스 파일(컴파일된 .class)을 저장하여 관리하는 디렉터리
- 자바 응용프로그램은 하나 이상의 패키지로 구성

(2) 접근 지정자
* 자바의 접근 지정자
- 4가지 : private, protected, public, 디폴트(접근지정자 생략)

* 접근 지정자의 목적
- 클래스나 일부 멤버를 공개하여 다른 클래스에서 접근하도록 허용
- 객체 지향 언어의 캡슐화 정책은 멤버를 보호하는 것
-- 접근 지정은 캡슐화에 묶인 보호를 일부 해제할 목적

- 접근 지정자에 따른 클래스나 멤버의 공개 범위

(3) 클래스 접근 지정
* 클래스 접근지정
- 다른 클래스에서 사용하도록 허용할 지 지정

* public 클래스
- 다른 모든 클래스에게 접근 허용

* 디폴트 클래스 (접근지정자 생략)
- package-private라고도 함
- 같은 패키지의 클래스에만 접근 허용

(4) 멤버 접근 지정
- 클래스 맴버에 대한 접근 지정

* public 멤버
- 패키지에 관계 없이 모든 클래스에게 접근 허용

* private 멤버
- 동일 클래스 내에만 접근 허용
- 상속 받은 서브 클래스에서 접근 불가

* protected 멤버
- 같은 패키지 내의 다른 모든 클래스에게 접근 허용
- 상속 받은 서브 클래스는 다른 패키지에 있어도 접근 가능

* 디폴트(default) 멤버
- 같은 패키지 내의 다른 클래스에게 접근 허용

(4.1) 멤버 접근 지정 사례
* public 접근 지정 사례
* private 접근 지정 사례
* 디폴트 접근 지정 사례
* protected 접근 지정 사례

(4.2) 예제 4-10 : 멤버의 접근 지정자
- 다음 코드의 두 클래스 Sample과 AccessEx 클래스는 동일한 패키지에 저장된다. 
- 컴파일 오류를 찾아 내고 이유를 설명하라.

- Sample 클래스의 a와 c는 
   각각 public, default 지정자로 선언이 되었으므로, 
   같은 패키지에 속한 AccessEx 클래스에서 접근 가능

- b는 private으로 선언이 되었으므로 AccessEx 클래스에서 접근 불가능


4.8) static 멤버 (책 172p)
(1) static 멤버 선언
(2) static 멤버의 특성 - 객체 생성과 non-static 멤버의 생성
- non-static 멤버는 객체가 생성될 때, 객체마다 생긴다

(2.1) static 멤버의 특성 - static 멤버의 생성
- static 멤버는 클래스당 하나만 생성
- 객체들에 의해 공유됨

(2.2) static 멤버와 non-static 멤버 특성 정리
 
(3) static 멤버 사용
* 클래스 이름으로 접근 가능
* 객체의 멤버로 접근 가능
* non-static 멤버는 클래스 이름으로 접근 안 됨

(4) static의 활용
1. 전역 변수와 전역 함수를 만들 때 활용
2. 공유 멤버를 만들고자 할 때
- static으로 선언한 멤버는 클래스의 객체들 사이에 공유

(4.1) 예제 4-11 : static 멤버를 가진 Calc 클래스 작성
- 전역 함수로 작성하고자 하는 abs, max, min의 3개 함수를 static 메소드를 작성하고 호출하는 사례를 보여라.

(4.2) static 메소드의 제약 조건 1
- static 메소드는 오직 static 멤버만 접근 가능
-- 객체가 생성되지 않은 상황에서도 static 메소드는 실행될 수 있기 때문에, non-static 멤버 활용 불가
-- non-static 메소드는 static 멤버 사용 가능

(4.2) static 메소드의 제약 조건 2 
- static 메소드는 this 사용불가
-- static 메소드는 객체 없이도 사용 가능하므로, this 레퍼런스 사용할 수 없음



4.9) final 클래스와 메소드 (책 176p)

(1) final 클래스
- final 클래스 - 더 이상 클래스 상속 불가능
- final 메소드 - 더 이상 오버라이딩 불가능

(2) final 필드 
* final 필드, 상수 선언
- 상수를 선언할 때 사용

- 상수 필드는 선언 시에 초기 값을 지정하여야 한다
- 상수 필드는 실행 중에 값을 변경할 수 없다