독학/[책] 자바

[혼공학습단 10기☕️] 자바 week2

최연재 2023. 7. 16. 07:46

미션

기본 미션 : p. 330 문제 5번 실행 결과 인증 화면 캡처하기

선택 미션 : 객체 지향 프로그래밍의 개념을 정리하기

📌 객체
물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있으면서 식별 가능한 것
속성과 동작으로 구성
 
📌 객체 지향 프로그래밍 (Object-Oriented Programming, OOP)

모든 데이터 객체로 취급하여 프로그래밍하는 방법으로, 처리 요구를 받은 객체가 자기 자신의 내용을 가지고 처리하는 방식

https://terms.naver.com/entry.naver?docId=1128207&cid=40942&categoryId=32837 

객체지향프로그래밍

모든 데이터를 오브젝트(object;물체)로 취급하여 프로그래밍 하는 방법으로, 처리 요구를 받은 객체가 자기 자신의 안에 있는 내용을 가지고 처리하는 방식이다. 이 개념은 1960년 중엽에 유행한

terms.naver.com


Chapter 6 클래스

1. 객체 지향 프로그래밍

📌 객체와 상호작용
- 객체는 각각 독립적으로 존재, 다른 객체와 상호작용. 
- 객체들 사이의 상호작용수단은 메소드.
- 메소드 호출
리턴값 = 객체.메소드(매개 값1, 매개 값2, ...)
 
📌 객체 간의 관계
- 집합 관계 : 부품과 완성품의 관계
- 사용 관계 : 객체 간의 상호작용
- 상속 관계 : 상위 객체를 기반으로 하위 객체를 생성하는 관계
 
📌 객체와 클래스
- 클래스 : 객체를 생성하기 위한 필드와 메소드가 정의되어 있음
- 인스턴스: 클래스로부터 만들어진 객체
 
📌 클래스 선언
- 식별자 작성 규칙

  • 하나 이상의 문자로 이루어져야 함.
  • 첫 글자에는 숫자 불가
  • $, _ 외의 특수 문자 사용 불가
  • 자바 키워드 사용 불가

- 클래스 이름을 정했다면 클래스이름.java 소스 파일을 생성하고, 클래스를 선언한다.

pubilc class 클래스명

- 소스 파일은 클래스 선언을 담고 있는 것이지 클래스 자체가 아니다.
 
📌 객체 생성과 클래스 변수
- 객체 생성 : new 연산자 사용

클래스 변수;
변수 = new 클래스;
클래스 변수 = new 클래스();

 
📌 클래스의 구성
- 필드 : 객체의 데이터가 저장되는 곳
- 생성자 : nw 연산자로 호출되는 특별한 중괄호 블록, 객체 생성 시 초기화 역할 담당
- 메소드 : 객체의 동작에 해당된느 중괄호 블록

 

2. 필드

📌 필드
: 객체의 고유 데이터, 객체의 현재 상태 데이터 등을 저장하는 곳
 
📌 필드 선언
- 클래스 중괄호 {} 블록 어디서든 존재 가능
- 생성자와 메소드 중괄호 {} 블록 내에서는 선언할 수 없음.
- 초기값은 타입에 따라 0, 공백, false, null 중 하나로 설정됨.

타입 필드 [= 초기값];

 
 
📌 필드 사용
- 필드값을 읽고 변경하는 작업을 말함.
클래스 외부에서 사용할 경우에는 클래스로부터 객체를 먼저 생성한 뒤에 필드를 사용해야 한다.
변수와 사용법은 동일하나, 변수와 다르게 필드는 생성자와 모든 메소드에서 사용 가능.

 

3. 생성자

📌 기본 생성자

[public] 클래스() {}

 
📌 생성자 선언
- 객체를 다양한 값으로 초기화하기 위해 명시적으로 생성자를 선언함.
- 메서드와 유사한 모양이나, 리턴 타입이 없고 클래스명과 동일
- 클래스에 생성자가 명시적으로 선언되어 있을 경우에는 반드시 선언된 생성자를 호출해서 객체를 생성해야 함.
 
📌 필드 초기화
- 필드를 선언할 때 초기값을 주거나, 생성자에서 초기값을 줄 수 있음.
- 필드와 매개변수명이 동일할 경우 매개변수의 우선순위가 높아서 생성자 내에서 해당 필드에 접근할 수 없음.
- 위와 같은 경우에는 필드 앞에 this.을 붙여서 해결 가능 (this라는 참조 변수로 필드 사용)
 
📌 생성자 오버로딩
- 매개변수를 다르게 하는 생성자를 여러 개 선언

public class 클래스 {
    // 생성자 오버로딩 : 매개변수의 타입, 개수, 순서가 다르게 선언
    클래스 ([타입 매개변수, ...]) {
    ...
    }
    
    클래스 ([타입 매개변수, ...]) {
    ...
    }
}

 
📌 다른 생성자 호출 : this()
- 생성자 오버로딩으로 인해 발생할 수 있는 중복된 코드 제거 가능
- this()는 자신의 다른 생성자를 코드로 반드시 생성자의 첫 줄에만 올 수 있다.

 

4. 메소드

📌 메소드 선언
- 선언부(리턴타입, 메소드 이름, 매개변수 선언), 실행 블록으로 구성됨.
- 메소드 이름은 소문자로 작성하는 것이 관례.
- 매개변수의 개수를 모를 때는 매개 변수를 배열 타입으로 선언
 
📌 메소드 호출
- 클래스 내외부의 호출에 의해 실행됨.
- 객체 외부에서 호출할 때는 먼저 클래스로부터 객체를 생성하고, 참조 변수와 함께 . 연산자를 사용
 
📌 메소드 오버로딩
- 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것
- 매개 변수의 타입, 개수, 순서 중 하나가 달라야 함
- 오버로딩된 메소드를 호출할 때는 JVM은 매개값을 타입을 보고 메소드를 선택함.

 

5.인스턴스멤버와 정적 멤버

📌 인스턴스 멤버와 this
- 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드를 인스턴스 필드, 인스턴스 메소드라고 부름
- 객체 내부에서 인스턴스 멤버에 접근하기 위해 this를 사용한다.
 
📌 정적 멤버와 static
- 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드
- 필드와 메소드 선언 시 static 키워드를 추가적으로 붙이면 됨.
- 이들 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없고, this 키워드도 사용 불가
 
⭐ 객체별로 가져야 할 데이터라면 인스턴스 필드로, 공용 데이터라면 정적 필드로 선언하는 것이 좋다.
 
📌 싱글톤
- 전체 프로그램에 존재하는 단 하나의 객체
- 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 생성자 앞에 private 접근 제한자를 붙임.
- getInstance() : 외부에서 객체를 얻는 유일한 방법, 단 하나의 객체만을 리턴
 
📌final 필드와 상수
- final필드 : 초기값이 저장되면 최종적인 값이 되어 프로그램 실행 도중에 수정할 수 없음

  • 초기값은 필드 선언 시 주거나, 생성자에사 줄 수 있음
  • 객체마다 저장되고, 생성자의 매개값을 통해 여러 가지 값을 가질 수 있음.

- 상수

  • 객체마다 저장할 필요가 없는 공용성을 띤다.
  • static이면서 final

 

6. 패키지와 접근 제한자

📌 패키지 선언
- 클래스를 작성할 때 해당 클래스가 어떤 패키지에 속하는지 선언하는 것

package 상위패키지.하위패키지;

public class ClassName {...}

- 패키지는 클래스의 일부
- 패키지명은 소문자로 작성하는 것이 관례이고, java로 시작하는 패키지는 자바 표준 API에서만 사용하므로 사용해서는 안 된다.
- 패키지가 없는 클래스를 생성 시 JDK 11 이후 버전부터는 에러가 발생한다.
 
📌 import 문
- 사용하고자 하는 클래스나 인터페이스가 다른 패키지에 소속되어 있을 때 import문을 사용
 
📌 접근 제한자
- public 접근 제한자 : 외부 클래스가 자유롭게 사용 가능
- protected 접근 제한자 :  같은 패키지나 자식 클래스에서 사용 가능
- private 접근 제한자 : 외부에서 사용 불가
- default 접근 제한 : 같은 패키지가 소속된 클래스에서만 사용할 수 있고, 위의 세 가지 접근 제한자가 적용되지 않을 경우 
 
📌 클래스의 접근 제한
- default 접근 제한 : 다른 패키지에서는 사용 불가
- public 접근 제한 : 다른 패키지에서도 사용 가능
 
📌 생성자의 접근 제한
- public 접근 제한 : 모든 패키지에서 아무런 제한 없이 생성자 호출 가능
- protected 접근 제한 : 같은 패키지에 속하는 클래스 + 해당 클래스의 자식 클래스에서 호출 가능
- default 접근 제한 : 같은 패키지에 속하는 클래스에서 호출 가능 
- private 접근 제한 : 클래스 내부에서만 생성자 호출 가능
 
📌 필드와 메소드의 접근 제한
- public 접근 제한 : 모든 패키지에서 아무런 제한 없이 사용 가능
- protected 접근 제한 : 같은 패키지에 속하는 클래스 + 해당 클래스의 자식 클래스에서 사용 가능
- default 접근 제한 : 같은 패키지에 속하는 클래스에서 사용 가능 
- private 접근 제한 : 클래스 내부에서만 사용 가능
 
📌 Getter와 Setter 메소드
- 객체의 무결성을 유지하기 위함
- Setter 메소드는 매개값을 검증해서 유효한 값만 객체의 필드로 저장할 수 있도록 함.
- Getter 메소드는 필드값을 가공한 후에 외부로 전달함. 
 
 
 


Chapter 7 상속

1. 상속

📌 클래스 상속
- 여러 개의 부모 클래스 상속 불가 == 다중 상속을 허용하지 않음
- 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외됨
- 부모 클래스와 자식 클래스가 다른 패키지에 존재한다면 default 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외

class 자식 클래스 extends 부모 클래스 {
}

 
📌 부모 생성자 호출
- 자식 객체 생성 시 부모 객체가 먼저 생성된다.

super(); // 부모의 기본 생성자 호출

- 부모 클래스에 기본 생성자가 없고 매개 변수가 있는 생성자만 있따면 자식 생성자에서 반드시 부모 생성자 호출을 위해 super(매개값,...)을 명시적으로 호출해야 함. 
 
📌 메소드 재정의
- 자식 클래스에서 부모 클래스의 메소드를 다시 정의하는 것

  • 부모의 메소드와 동일한 시그니처를 가져야 함.
  • 접근 제한을 강화시킬 수 없음
  • 새로운 예외 throw 불가

- 메소드가 재정의되었다면 부모 객체의 메소드는 숨겨져서 자식 객체에서 메소드를 호출하면 재정의된 자식 메소드가 호출된다.
- 재정의된 부모 메소드를 호출해야 한다면 명시적으로 super 키워드를 붙여서 호출할 수 있다.
 
📌 final 클래스와 final 메소드
- final 클래스는 부모 클래스가 될수 없다.
- final 메소드는 자식 클래스에서 재정의할 수없다.

 

2. 타입 변환과 다형성

📍다형성
: 사용방법은 동일하지만 다양한 객체를 사용해서 다양한 실행 결과가 나오도록 하는 성질
 
📌 자동 타입 변환
- 자식은 부모 타입으로의 자동 변환이 가능하다.
- 자식은 부모의 특징과 기능을 상속받으므로 부모와 동일하게 취급될 수 있다.
- 바로 위의 부모가 아니어도 상속 계층에서 상위 타입이라면 자동 타입 변환이 일어날 수 있다.
- 부모 타입으로 자동 변환된이후에는 부모 필드에 선언된 필드와 메소드에만 접근 가능하다.
⭐ 메소드가 자식 클래스에서 재정의되었다면 자식클래스의 메소드가 대신 호출된다.
 
📌필드의 다형성

  • 필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장될 수 있다.
  • 그 결과 필드사용 결과가 달라질 수 있다.

 
📌 매개변수의 다형성
매개값을 다양화하기 위해 매개변수에 자식 객체 지정 가능
 
강제 타입 변환
- 부모 타입을 자식으로 변환하는 것
- 자식 타입이 부모 타입으로 자동 타입 변환된 후 다시 자식 타입으로 변환할 때 강제 타입 변화를 사용 가능
- 타입 캐스팅 이용
 
📌객체 타입 확인

boolen result = 객체 instanceof 타입

- 타입으로 객체가 생성되었다면 true, 아니면 false 리턴

 

3. 추상 클래스

📌 추상 클래스
- 객체를 직접 생성할 수 있는 클래스들의 공통된 특성을 추출해서 선언한 클래스
 
📌 추상 클래스의 용도
- 공통된 필드와 메소드의 이름을 통일할 목적
- 실체 클래스를 작성할 때의 시간 절약
 
📌 추상 클래스 선언

public abstract class 클래스 {
    // 용도
    // 생성자
    // 메소드
}

📌 추상 메소드 정의와 재정의
- 메소드의 선언만 같고, 실행 내용은실제 클래스마다 달라야 하는 경우를 위해 추상 클래스는 추상 메소드를 정의 가능
- 추상 메소드 선언

[public | protected] abstract 리턴타입 메소드이름(매개변수, ...);

- 추상 클래스 설계 시 하위 클래스가 반드시 실행 내용을 채우도록 강제하고 싶은 메소드가 있을 경우에 해당 메소드를 추상 메소드로 정의
 
 
 


Chapter 8 인터페이스

1. 인터페이스

📍 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출함.
 
📌 인터페이스 선언
- 물리적 형태는 클래스와 동일하나, class 키워드 대신 interface 키워드 사용
- 상수 필드와 추상 메소드만을 가질 수 있다.
- 상수 필드 선언

  • 인터페이스에 고정된 값으로 실행시데이터를 바꿀 수 없다.
  • public static final의 특성을 갖고, 선언 시 생략해도 컴파일 과정에서 자동으로 붙는다.

- 추상 메소드 선언

  • public abstract의 특성을 갖고, 선언 시 생략해도 컴파일 과정에서 자동으로 붙는다.

 
📌 인터페이스 구현
- 구현 객체

  • 인터페이스에서정의된 추상 메소드와 동일한 메소드 이름, 매개 타입, 리턴 타입을 가진실체 메소드를 가진 객체

- 구현 클래스

  • 구현 객체를 생성하는 클래스
  • 구현 클래스가 작성되면 new 연산자로 객체를 생성할 수 있다.
public class 구현클래스명 implements 인터페이스명{
    // 인터페이스에 선언된 추상 메소드의 실체 메소드 구현
}

- 다중 인터페이스 구현 클래스

public class 구현클래스명 implements 인터페이스1, 인터페이스2 {
    // 인터페이스1에 선언된 추상 메소드의 실체 메소드 구현
    // 인터페이스2에 선언된 추상 메소드의 실체 메소드 구현
}

 
📌 인터페이스 사용
- 클래스를 선언할 때 인터페이스는 필드, 생성자 또는 메소드의 매개변수, 생성자 또는 메소드의 로컬 변수로 선언될수 있음 

  • 필드 타입으로 사용 : 필드에 구현 객체 대입 가능
  • 생성자의 매개변수 타입으로 사용 : new 연산자로 객체 생성 시 구현 객체를 매개값으로 대입 가능
  • 로컬 변수 타입으로 사용 : 변수에 구현 객체 대입 가능
  • 메소드의 매개변수 타입으로 사용 : 메소드 호출 시 구현 객체를 매개 값으로 대입 가능

 

2. 타입 변환과 다형성

📌 자동 타입 변환
- 구현객체가 인터페이스 타입으로 변환되는 것
- 인터페이스 구현 클래스를 상속해서 자식 클래스를 만들었다면 자식 객체도 인터페이스 타입으로 자동 타입 변환 가능
- 필드의 다형성과 매개변수의 다형성 구현 가능
 
📌 매개 변수의 다형성
- 매개변수를 인터페이스 타입으로 선언하고 호출 시 구현 객체 대입
 
📌 강제 타입 변환
- 구현 객체가 인터페이스 타입으로 자동 타입 변환되면 인터페이스에 선언된 메소드만 사용 가능
- 구현클래스에 선언된 필드와 메소드를 사용해야 할 경우에는 강제타입 변환으로 다시 구현 클래스 타입으로 변환하여  메소드를 사용 
 
📌 인터페이스 상속
- 인터페이스는 다중 상속을 허용
- 하위 인터페이스를 구현하는 클래스는 하위 인터페이스의 메소드뿐만 아니라 상위 인터페이스의 모든 추상 메소드에 대한 실체 메소드를 가지고 있어야 함.
 
 
 


Chapter 9 중첩 클래스와 중첩 인터페이스

1. 중첩 클래스와 중첩 인터페이스 소개

📌 중첩 클래스
- 클래스 내에 선언된 클래스
- 위치에 따라 두 가지로 분류됨.

  • 멤버 클래스 : 클래스의 멤버로서 선언, 클래스나 객체가 사용 중이라면 재사용 가능
  • 로컬 클래스 : 생성자 또는 메소드 내부에서 선언, 메소드가 종료되면 없어짐.

- 인스턴스 멤버 클래스

  • static 키워드 없이 중첩 선언된 클래스
  • 인스턴스 멤버 클래스는 인스턴스 필드와 메소드만 선언 가능, 정적필드와 메소드는 선언 불가

- 정적 멤버 클래스

  • static 키워드로 선언된 클래스
  • 모든 종류의 필드와 메소드 선언 가능

- 로컬 클래스

  • 접근 제한자를 붙일 수 없음.  (메소드 내부에서만 사용되므로)
  • 인스턴스 필드와 메소드만 선언 가능

 
📌 중첩 클래스의 접근 제한

  • 클래스 내부에서 바깥 클래스의 필드와메소드를 접근할 때 제한이 따름
  • 메소드의 매개변수나 로컬 변수를 로컬 클래스에서 사용할 때 제한이 따름

- 중첩 클래스 내부에서 바깥 클래스의 객체 참조를 얻기 위해서는 바깥 클래스의 이름을 this 앞에 붙이면 된다.

바깥클래스.this.필드
바깥클래스.this.메소드();

 
📌 중첩 인터페이스
- 클래스의 멤버로 선언된 인터페이스
- 인스턴스 멤버 인터페이스와 정적 인터페이스 모두 가능

 

2. 익명 객체 

📍 익명 객체의 조건 : 어떤 클래스를 상속하거나 인터페이스를 구현해야 함.
 
📌 익명 자식 객체 생성
- 자식 클래스가 특정 위치에서만 사용될 경우 익명 자식 객체 생성

부모클래스 [필드|변수] = new 부모클래스(매개값, ...){
    // 필드
    // 메소드
};

 
📌 익명 구현 객체 생성
- 구현 클래스가 재사용되지 않고 오로지 특정 위치에서만 사용할 경우 익명 구현 객체 생성

인터페이스 [필드|변수] = new 인터페이스() {
    // 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
    // 필드
    // 메소드
}

 
 
 


이번 주에는 평일 내내 학교에서 진행되는 교육+해커톤에 참여하느라 주말에야 시간을 낼 수 있었습니다. 처음 나간 해커톤에서 수상해서 굉장히 기뻤던 한 주였고, 토요일부터 자바를 공부해서 올립니다.
 
객체 지향 프로그래밍의 개념을 정리하는 게 좀 어려웠습니다. 파이썬에서 클래스를 배웠고 지금 자바를 학습하면서 어느 정도는 아는데 한 문장으로 정리할 정도의 실력은 없다는 것을 느꼈습니다. 일단은 네이버 지식백과의 요약을 인용했고, 좀 더 공부하면서 제가 스스로 내용을 채워보겠습니다.