요약

1. 객체지향 프로그래밍 요약 - 패스트캠퍼스 백엔드 부트캠프 3기

gkss2tpt 2024. 12. 25. 14:25

1. 객체란 무엇인가?

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

2. 객체지향의 핵심개념

  • 캡슐화
  • 상속
  • 추상화
  • 다형성

3. 객체의 구성요소

  • 변수와 메서드의 묶음

4. 객체와 인스턴스

  • 객체 : 모든 인스턴스를 대표하는 일반적 용어
  • 인스턴스 : 특정 클래스로부터 생성된 객체

5. 클래스란 무엇인가?

  • 데이터와 함수의 결합
    • 변수 : 하나의 데이터를 저장할 수 있는 공간
    • 배열 : 같은 종류의 여러 데이터를 하나로 저장할 수 있는 공간
    • 구조체 : 서로 관련된 여러 데이터(종류 관계X)를 하나로 저장할 수 있는 공간
    • 클래스 : 데이터와 함수의 결합(구조체 + 함수)
  • 설계도
  • 사용자 정의 타입
    • 원하는 타입을 직접 만들 수 있다.

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

class Variables
{    // 클래스 영역 (선언문만 가능)
    int iv;		// 인스턴스 변수
    static int cv;	// 클래스 변수(static변수, 공유변수)
    
    // 메서드 영역
    voic method()
    {
    	int lv = 0;	//지역변수
    }
}
변수의 종류선언위치생성시기
클래스변수 - static변수, 공유변수
(class variable)
클래스 영역클래스가 메모리에 올라갈 때
인스턴스 변수
(instance variable)
인스턴스가 생성되었을 때
(new Variables())
지역변수
(local variable)
클래스 영역 이외의 영역
(메서드 생성자, 초기화 블럭 내부)
변수 선언문이 수행되었을 때

 
7. 클래스 변수와 인스턴수 변수

  • 인스턴스 변수(개별 속성)
  • 클래스 변수(공통 속성)

8. 메서드

  • 작업단위로 문장들을 묶어놓은 것
  • 값(입력)을 받아서 처리하고, 결과를 반환(출력)
  • 함수는 클래스에 독립적

9. 메서드의 장점

  • 코드의 중복을 줄일 수 있다.
  • 코드의 관리가 쉽다.
  • 코드를 재사용할 수 있다.
  • 코드가 간결해서 이해하기 쉬워진다.

10. 메서드의 작성

  • 반복적으로 수행되는 여러 문장을 메서드로 작성
  • 하나의 메서드는 한 가지 기능만 수행하도록 작성

11. return문

  • 실행 중인 메서드를 종료하고 호출한 곳으로 되돌아간다.
  • 반환타입이 void가 아닌경우, 반드시 return문 필요

12. 호출 스택(call stack)

  • 메서드 수행에 필요한 메모리가 제공되는 공간
  • 메서드가 호출되면 호출스택에 메모리 할당, 종료되면 해제

13. 기본형 매개변수

  • 변수의 값을 읽기만 할 수 있다.(read only)

14. 참조형 매개변수

  • 변수의 값을 읽고 변경할 수 있다.(read & write)

15. 인스턴스 메서드

  • 인스턴스 멤버(iv,im)와 관련된 작업을 하는 메서드
  • 메서드 내에서 인스턴스 변수 사용가능

16. static 메서드(클래스 메서드)

  • 객체생성없이 호출가능
  • 인스턴스 멤버(iv, im)와 관련없는 작업을 하는 메서드
  • 메서드 내에서 인스턴스 변수 사용불가

17. 오버로딩(overloading)

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

18. 오버로딩의 성립 조건

  • 메서드 이름이 같아야 한다.
  • 매개변수의 개수 또는 타입이 달라야 한다.
  • 반환 타입은 영향없다.

19. 생성자(constructor)

  • 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'
  • 모든 클래스는 반드시 생성자를 가져야 한다.

20. 기본 생성자

  • 생성자가 하나도 없을 때만, 컴파일러가 자동 추가
  • 매개변수가 없는 생성자

21. 생성자 this()

  • 생성자에서 다른 생성자 호출할 때 사용
  • 다른 생성자 호출시 첫 줄에서만 사용가능

22. 참조변수 this

  • 인스턴스 자신을 가리키는 참조변수
  • 인스턴스 메서드(생성자 포함)에서 사용가능

23. 참조변수 super

  • 객체 자신을 가리키는 참조변수 인스턴스 메서드(생성자)내에만 존재
  • 조상의 멤버를 자신의 멤버와 구별할 때 사용

24. super() - 조상의 생성자

  • 조상의 생성자를 호출할 때 사용
  • 조상의 멤버는 조상의 생성자를 호출해서 초기화
  • 생성자의 첫 줄에 반드시 생성자를 호출해야 한다.

25. 변수의 초기화

  • 지역변수(lv)는 수동 초기화 해야 함
  • 멤버변수(iv, cv)는 자동 초기화된다.

26. 멤버변수의 초기화

  • 명시적 초기화(간단한 초기화) : =
  • 초기화 블럭(복잡한 초기화)
    • 인스턴스 초기화 블럭 : {}
    • 클래스 초기화 블럭 : static {}
  • 생성자(복잡한 초기화)

27. 상속(Inheritance)

  • 기존의 클래스로 새로운 클래스를 작성하는 것(코드의 재사용)
  • 두 클래스를 부모와 자식으로 관계를 맺어주는 것
  • 자손은 조상의 모든 멤버를 상속받는다(생성자, 초기화블럭 제외)
  • 자손의 멤버 개수는 조상보다 적을 수 없다.
  • 자손의 변경은 조상에 영향을 미치지 않는다.

28. 포함(composite)

  • 클래스의 멤버로 참조변수를 선언하는 것

29. 단일 상속(Single Inheritance)

  • Java는 단일상속만을 허용한다.(C++은 다중상속 허용)
  • 비중이 높은 클래스 하나만 상속관계로 나머지는 포함관계로 한다.

30. Object클래스 - 모든 클래스의 조상

  • 부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 된다.
  • 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.

31. 메서드 오버라이딩(overriding)

  • 상속받은 조상의 메서드를 자신에 맞게 변경하는 것

32. 오버라이딩의 조건

  • 선언부가 조상 클래스의 메서드와 일치해야 한다.
  • 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  • 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

33. import문

  • 클래스를 사용할 때 패키지이름을 생략할 수 있다.
  • import문은 컴파일시에 처리되므로 프로그램의 성능에 영향없음

34. 제어자(modifier)

  • 클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여
  • 접근 제어자
    • public, protected, (default), private
  • 그 외
    • static, final, abstract, native, transient, synchronized, volatile, strictfp
  • 하나의 대상에 여러 제어자를 같이 사용가능(접근 제어자는 하나만)

35. static - 클래스에 공통적인

제어자대상의 미
static멤버변수-모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다.
-클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다.
-클래스가 메모리에 로드될 때 생성된다.
메서드-인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
-static메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없다.

 
36. final - 마지막의, 변경될 수 없는

제어자대상의 미
final클래스변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다.
그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
메서드변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
멤버변수변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.
지역변수

 
37. abstract - 추상의, 미완성의

제어자대상의 미
abstract클래스클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
메서드선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다.

 
38. 접근제어자(access modifier)

  • private : 같은 클래스 내에서만 접근이 가능하다.
  • (default) : 같은 패키지 내에서만 접근이 가능하다.
  • protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.
  • public : 접근 제한이 전혀 없다.
제어자같은 클래스같은 패키지자손클래스전체
publicOOOO
protectedOOO 
(default)OO  
privateO   

 
39. 캡슐화와 접근 제어자

  • 접근 제어자를 사용하는 이유
    • 외부로부터 데이터를 보호하기 위해서
    • 외부에는 불필요한 내부적으로만 사용되는 부분을 감추기 위해

40. 다형성(polymorphism)

  • 여러 가지 형태를 가질 수 있는 능력
  • 조상 타입 참조 변수로 자손 타입 객체를 다루는 것

41. 추상 클래스(abstract class)

  • 미완성 설계도, 미완성 메서드를 갖고 있는 클래스
  • 다른 클래스 작성에 도움을 주기 위한 것(인스턴스 생성 불가)
  • 추상화된 코드는 구체화된 코드보다 유연하다.(변경에 유리)

42. 추상 메서드(abstract method)

  • 미완성 메서드, 구현부(몸통, {})가 없는 메서드

43. 인터페이스(interface)

  • 추상 메서드의 집합
  • 구현된 것이 전혀 없는 설계도(모든 멤버가 public)

44. 인터페이스의 상속

  • 인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상 아님)
  • 다중 상속이 가능(추상메서드는 충돌해도 문제 없음)
  • 일부 구현의 경우 클래스 앞에 abstract를 붙여야 한다.

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

  • 인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능

46. 인터페이스의 장점

  • 두 대상(객체) 간의 '연결, 대화, 소통'을 돕는 '중간 역할'을 한다.
  • 선언(설계)와 구현을 분리시킬 수 있게 한다.
  • 개발 시간을 단축할 수 있다.
  • 변경에 유리한 유연한 설계가 가능하다.
  • 표준화가 가능하다.
  • 서로 관계없는 클래스들을 관계를 맺어줄 수 있다.

47. 디폴트 메서드와 static 메서드

  • 인터페이스에 디폴트 메서드, static메서드 추가 가능(JDK1.8부터)
  • 인터페이스에 새로운 메서드(추상 메서드)를 추가하기 어려움
  • 디폴트 메서드는 인스턴스 메서드(인터페이스 원칙 위반)

48. 디폴트 메서드가 기존의 메서드와 충돌할 때의 해결책

  • 여러 인터페이스의 디폴트 메서드 간의 충돌 시
    • 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩해야 한다.
  • 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
    • 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.

49. 내부클래스의 장점

  • 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수  있다.
  • 코드의 복잡성을 줄일 수 있다.(캡슐화)

50. 익명 클래스(anonymous class)

  • 이름이 없는 일회용 클래스(정의와 생성을 동시에)