[커널아카데미] 백엔드 12기 3주차 - 자바_객체지향 개념 정리

jh5959·2025년 4월 13일
0

6장 객체지향1

oop = 그룹 & 관계 => 변경유리
=> 클래스를 작성하고 클래스 간 관계맺기

객체지향개념 목표 = 프로그램 변경 쉽게

  • 코드의 재사용성 높음
  • 유지보수가 용이
  • 중복코드 제거

객체지향 개념의 4대 원칙
1. 캡슐화 - 접근 제어자로 데이터를 보호. 외부로부터 내부를 감추는 것
2. 상속 - 기존 클래스를 확장해서 새로운 클래스를 작성하는 것
3. 추상화 - 공통점을 뽑아내는 것. 덜구체적으로 만들기.
4. 다형성 - 조상 참조변수로 여러 종류의 자손 객체를 다루게 하는 것


클래스와 객체

클래스: 집합, 그룹, 폴더

  • 객체를 정의한 설계도
  • 변수+메서드(문장묶음)
  • 사용자 지정 타입

객체: 실제로 존재하는 것, 속성과 기능, 멤버(iv)의 집합
객체 생성: 클래스명 참조변수명 = new 클래스명();
객체배열: 참조변수 배열, 타입[ ] 배열이름 = new 타입[n];
객체배열 생성 후 반드시 객체 생성하기


변수의 종류

클래스 영역

  • cv: 객체 생성X, 자동생성, 아무때나 사용가능
  • iv: 객체 생성O, 객체생성필요, 객체생성해야 사용가능
    메서드 영역
  • lv: 클래스 이외의 영역, 메서드 종료시 자동제거
    iv와 cv
  • iv: 인스턴스마다 개별 저장 공간, ex) 숫자, 모양
  • cv: 모든 인스턴스가 공유, ex)길이, 폭

지역변수: 매서드 내에서 선언된 변수, 메서드 영역이 서로 다른 지역변수들은 이름이 겹쳐도 상관X


메서드

메서드: 문장묶음, 꼭 클래스안에 있어야 함

  • 입력(값)-> [ ] -> 출력(반환값)
  • 선언부 + 구현부
    장점
  • 재사용성
  • 중복코드제거
  • 프로그램구조화
    메서드 실행 흐름
  • 객체 생성 -> 메서드 호출 -> 메서드 안 수행문 수행 -> 호출한 곳으로 반환

return 문

  • 실행중인 메서드를 종료하고 호출한 곳으로 되돌아감
  • void를 제외, 반드시 return문 필요
  • 반환값의 데이터 타입 = 메서드 선언부의 반환형

유효성 검사: 입력한 매개변수의 값이 적절한가

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

  • 기본형 매개변수: R만 가능
  • 참조형 매개변수: R W 가능

참조형 반환타입

  • 객체 주소 반환
  • 객체 주소를 줬기 때문에 객체를 다룰 수 있음
  • 메서드와 반환받는 타입이 참조형으로 일치해야 함

재귀호출: 메서드가 자기 자신을 호출해서 일을 시키는 것


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

static 메서드

  • 객체 생성 없이 클래스이름.메서드이름()으로 호출
  • 인스턴스 멤버(iv,im)와 관련없는 작업
  • 메서드 내에서 iv 사용 불가(static 붙여야 함),매개변수로 전달 받음

인스턴스 메서드

  • 객체 생성 후 참조변수.메서드이름()으로 호출
  • 인스턴스 멤버(iv,im)와 관련된 작업을 하는 메서드
  • 매개변수없이 메서드에서 iv 사용가능

static 메서드는 인스턴스 메서드를 호출 X

  • static은 iv 사용 불가, 객체가 있을지 없을지 모름
    인스턴스 메서드는 static 메서드 호출 O
  • 인스턴스 메서드가 호출됐으면 이미 객체 생성(iv가 이미 존재)

오버로딩

: 같은 이름의 메서드를 여러개 정의하는 것
조건

  • 메서드 이름이 같아야 한다
  • 매개변수의 개수 또는 타입이 달라야 함
  • 반환타입 영향 X
    ex) println()

생성자

: 인스턴스 초기화 메서드
조건

  • 생성자 이름 = 클래스 이름
  • 반환타입없음(void 안씀)
  • 다른 생성자 호출은 반드시 첫줄에서 해야 함
  • 다른 생성자 호출 시 this() 사용

모든 클래스에 생성자가 한개는 있어야 함

기본생성자

클래스이름() {}: 매개변수도 하는 일도 없음, 기본옵션

  • 매개변수 없는 생성자
  • 생성자가 하나도 없을 때만 컴파일러가 자동추가 해줌
  • Card()

매개변수가 있는 생성자

  • 인스턴스를 생성하는 동시에 원하는 값으로 초기화 가능
  • 이렇게 하는게 코드가 간결해짐
  • ex)Card(String k, int num)

생성자 this()

  • 생성자에서 같은 클래스의 다른 생성자를 호출할 때, 클래스이름 대신 this 사용
  • 다른 생성자 호출 시 첫줄에서만 사용가능

참조변수 this

  • iv와 lv 구분, this가 있으면 iv, 없으면 매개변수와 가까운 lv
  • 인스턴스 자신을 가르키는 참조변수(객체주소가 저장되어있음)
  • 인스턴스 메서드에서만 사용 가능/ static 메서드에서는 사용불가

변수의 초기화

  • 멤버변수(iv, cv) : 자동초기화
  • 지역변수(lv)는 우리가 수동으로 초기화

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

1) 자동: 0 (타입의 기본값)
2) 간단: =
3) 복잡: { } ->거의 안씀, static { } -> cv , 생성자( ){ } -> iv

  • cv -> iv
  • 자동 -> 간단 -> 복잡

7장 객체지향2

상속

  • 기존 클래스가 확장해서 새로운 클래스 작성
  • 자손은 조상의 모든멤버를 상속받음(생성자와 초기화 블럭 제외)
  • 자손의 변경 => 조상 영향 X
  • 자손의 멤버개수는 조상보다 같거나 많다

포함

  • 클래스 안에 다른 클래스 타입의 iv를 선언하는 것
  • 작은 단위의 클래스를 만들고 이들은 조합해서 클래스 만든다

클래스 간의 관계

  • 상속관계
    - ~는 ~를 이다(is a)
    - extends Point{}
  • 포함관계
    - ~는 ~를 가지고 있다(has a)
    - Point c = new Point();

상속 특징

  • 계층 구조 바꾸기 어렵다
  • 단일 상속
  • 부모를 지정

포함 특징

  • 포함이 상속보다 유연- 다형성 때문에
  • 다형성을 이용할 수 없기도 함(대신 덕타이핑)

상속은 하나만 하고 나머지는 포함 사용


Object 클래스

  • 모든 클래스의 조상
  • 조상 클래스 = Object 클래스 상속(컴파일러)
  • 모든 클래스 = Object 클래스의 정의된 메서드 상속(ex. toString 등)

오버라이딩

: 조상의 메서드를 자신에게 맞게 새로 작성하는 것
조건

  • 선언부가 같아야 함
  • 접근제어자를 좁게 X
  • 조상보다 예외선언을 많게 X

생성자 super()

  • 조상의 생성자 호출
  • 조상의 멤버는 조상의 생성자를 호출해서 초기화, 자손의 생성자는 자신이 선언한 변수만 초기화 할 수 있음
  • 모든 생성자는 첫 줄에 다른 생성자를 호출해야 함 -> 그렇지 않으면 컴파일러가 super()를 만듦
  • 기본생성자 호출x 매개변수가 있는 생성자 호출 ex) super(x,y)

참조변수 super

  • 조상멤버와 자신의 멤버 이름 구별
  • 객체 자신을 가르티는 참조변수, 인스턴스 메서드(생성자) 내에서만 존재

패키지

  • 클래스 묶음, 패키지 안 패키지
  • 패키지 = 폴더, 클래스 = 파일

클래스패스: 클래스파일을 찾는 경로

import 문

  • 패키지명 매번 쓰지 않고 미리 명시

static import

  • static 멤버를 호출할 때 클래스 이름 생략

제어자

: 클래스나 클래스 멤버에 부가적 의미 부여

  • 접근제어자: 4개 중 1개만 사용가능
  • 그 외
  • 제어자 여러개 사용 가능, 접근제어자는 한개만 가능

static: 클래스의, 공통적인

  • 멤버변수 - cv
  • 메서드 - static 메서드

final: 마지막의, 변경될 수 x

  • 클래스: 변경 확장X, 조상클래스 X, 가장 마지막 클래스
  • 메서드: 변경X , 오버라이딩X
  • 변수(멤버변수, 지역변수): 상수

abstract: 추상의, 미완성의(추상화)

  • 클래스: 추상클래스(추상메서드를 포함한 클래스)
  • 메서드: 추상 메서드(구현부X)
  • 추상클래스 - 인스턴스 생성 불가
    🔺추상클래스를 상속받아서 완전한 클래스(설계도)를 만든 후 객체 생성 가능

접근제어자

: 클래스와 클래스의 멤버에 붙이는 형용사, 캡슐화를 가능하게 해주는 중요한 요소

접근제어자 종류

  • public: 제한 전혀 없음
  • protected: 같은 패키지 + 자손
  • (default): 같은 패키지
  • private: 같은 클래스

캡슐화 목적

  • 데이터 보호
  • 불필요한 부분 감추기(복잡도, 의존도를 낮추기)

다형성

  • 조상 타입 참조 변수로 자손 타입 객체 다룸
  • 하나의 배열에 여러종류 객체 저장
  • 참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버의 개수보다 적어야 함
  • 참조변수 타입과 인스턴스 타입은 보통 일치하지만 일치하지 않을 수 있다

참조변수 형변환

  • 멤버의 개수 조절, 값 변경X
  • 조상과 자손의 관계에서 형변환 가능
  • 리모컨 기능이 많은 쪽에서 적은 쪽으로 줄이는건 안전, 자손 -> 조상⭕
  • 적은 쪽을 늘리 때는 안전하지 않으니 형변환 하기, 조상 -> 자손🔺

instanceof 연산자

  • 참조변수의 형변환 가능 여부 확인, 가능하면 true
  • 꼭 해줘야 한다
  • if 문에 사용

매개변수의 다형성

  • 참조형 매개변수는 메서드 호출 시 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다

여러 종류의 객체를 배열로 다루기

  • 조상 타입의 배열에 자손타입의 객체를 담을 수 있다
  • 다루고 싶은 객체들의 상속관계를 따져서 가장 가까운 공통조상 클래스타입의 참조변수 배열을 생성해서 객체들을 저장

추상클래스

  • 추상메서드를 가진 클래스
  • 다른 클래스 작성에 도움을 주기 위한 것으로 인스턴스 생성 불가
  • 상속을 통해 완성해야 인스턴스 생성가능

추상화

  • 템플릿을 뽑아내는 것(틀, 공통적인 것, 미완성)
  • 잘 안바뀌는 부분, 공통적인 부분을 만들어 놓고 그걸 사용해서 나머지를 만든다

추상메서드

  • 구현부가 없는 미완성 메서드
  • 공통적으로 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우 사용함(구현부가 자손마다 다를 경우)
  • 추상메서드를 한개라도 구현하지 않으면 여전히 미완성(abstract 붙여야 함)
  • 여러 클래스에 공통적으로 쓸 수 있는 추상클래스를 바로 작성하거나 기존 클래스의 공통된 부분을 뽑아서 추상클래스 작성성

추상클래스 장점

  • 설계도 쉽게 작성
  • 중복코드제거
  • 코드관리 용이

인터페이스

  • 추상메서드의 집합
  • 구현된 것이 없는 설계도, 껍데기(모든 멤버가 public)
  • 추상클래스보다 추상화 정도가 높다
  • 메서드 핵심
  • 두 대상 사이의 중간역할
  • 인터페이스의 조상은 인터페이스만 가능
  • 다중상속 가능(추상메서드는 구현부분이 없어 충돌X)
interface 인터페이스이름{
	public static final 타입 상수이름 = 값;//상수O, iv,cv X
public abstract 메서드이름(매개변수 목록); //추상메서드(구현X)
}

public static final abstract 생략 가능

추상클래스와 인터페이스 차이

  • 추상클래스: 추상메서드 + 일반 클래스
  • 인터페이스: 추상메서드 빼고 구현된 것이 없음
  • 둘 다 추상메서드를 가지지만 인터페이스는 iv 사용 불가

인터페이스 구현

class 클래스이름 implements 인터페이스이름{
	(인터페이스에 정의된 추상메서드를 모두 구현해야 함)
}
  • 일부만 구현할 경우, 클래스 앞에 abstract 붙임(상속을 통해 자손이 마저 구현한다)

인터페이스를 이용한 다형성

  • 인터페이스도 구현클래스의 부모다
  • 인터페이스 타입의 매개변수 : 해당 인터페이스를 구한 클래스의 객체를 제공
  • 인터페이스 타입의 반환타입 : 해당 인터페이스를 구햔한 클래스의 객체를 반환

인터페이스의 장점

  • 표준화 가능
  • 관계 맺어주기 & 변경 가능: 직접 -> 간접
  • 독립적인 개발 가능
  • 두 대상의 연결, 대화를 하는 중간역할 = 기계와 소통이 쉽다
    - 선언과 구현 분리
    - A -> I B , A -> I C
    - A와 B는 직접적 연결X, B를 C로 바꿔도 A는 영향 X

주간회고

  • 객체지향이 모두 끝났다 중요한 만큼 어렵다
  • 정리한 내용을 자주 보며 복습해야겠다
  • 실습이 부족해서 실습를 더 늘려야겠다

0개의 댓글