발표자 : 최용호
발표 자료 + 강의 내용 부연 설명 정리
예제 코드
https://github.com/HyangKeunChoi/javacafe-oop
HyangKeunChoi/javacafe-oop
자바 카페 커뮤니티의 객체지향 강의 예제입니다. Contribute to HyangKeunChoi/javacafe-oop development by creating an account on GitHub.
github.com
객체지향 프로그래밍 (OOP : Object-Oriented Programming)
- 객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임의 하나이다.
- 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하 는 것이다.
- 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
객체(Object)란?
- 실세계와 비교하자면 세상에 존재하는 모든 사물이 객체
- 저장 공간에 할당된 공간
- 객체 참조 변수를 통해 해당 공간에 접근
- 하나의 클래스를 통해 다수의 객체가 생성되지만 각각의 객체는 고유함.
- 속성 + 행위
클래스(Class) 란?
- 같은 속성들과 기능들을 가진 객체들을 총칭하는 개념
- 이 개념적인 클래스를 통해 실체화 된 것이 객체(인스턴스).
- 객체는 필드(Field)와 메소드(Method)를 가진다
- 클래스를 통해 실체화된 객체는 필드를 통해 고유한 속성을 가지고 메소드로 행위를 한다.
필드(Field)
- 라이프 사이클
- 필드는 객체 소멸 시 함께 소멸
- 변수는 생성자 또는 메서드 수행이 종료되면 소멸
- 초기화
- 필드 선언 시
- 필드의 초기 값이 모든 객체에 대해 동일한 경우
- 생성자에서
- 객체 생성 시점에 외부의 값으로 대입이 필요한 경우
- 필드 선언 시
생성자
- new 연산자로 호출되며, 객체 생성 시 초기화를 담당.
- 클래스 이름으로 되어 있고 리턴 타입이 없다
- 명시하지 않으면 JVM이 기본 생성자 생성.
- 상속 관계에서 객체 생성은 상위 클래스가 먼저 초기화되고 하 위 클래스가 초기화된다.
메소드 (Method)
객체의 동작에 해당하며 해당 객체의 필드를 읽고 수정하는 역할과 객체 간의 상호작용 역할
- 선언부와 실행 블록으로 구성
- 선언부를 시그너처라고도 한다.
- 시그너처 : 반환 타입, 메서드명, 매개변수
메모리 영역
크게 메소드 / 스택 / 힙 영역으로 구성된다.
메소드영역
클래스 정보는 메서드 영역에서 관리된다.
한번 선언되면 해지되지 않는 고정되는 값들이 메소드 영역에 올라간다
힙
고유한 객체들은 힙 영역에 올라간다.
참조되지 않는 값들은 메모리에 남아 있을 필요가 없으므로 GC의 대상이 된다.
예를 들어
자동차 mycar = new 자동차();
스택
메소드가 호출되는 시점에 스택에 프레임이 만들어진다.
프레임안에 지역변수가 스택 자료구조 형태로 저장된다.
객체 vs 클래스
- 클래스는 메소드 영역에
- 객체는 힙 영역에
- 객체의 메소드가 수행되면 스택 프레임이 생성
- 메소드 내의 지역변수들은 스택 프레임의 스택에 쌓임
객체지향의 4대 특성
- 캡슐화 (Encapsulation)
- 상속(inheritance)
- 추상화(Abstraction)
- 다형성(Polymorphism)
캡슐화 (Encapsulation)
- 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 함
- 정보 은닉
- 변화에 유연한 대응
Getter / Setter
- 객체의 데이터를 외부에서 마음대로 읽고 변경할 경우 객체의 무결성이 깨어질 수 있기 때문에 외부에서 직접적으로 접근하는 것을 막는다.
- 객체의 데이터를 외부에서 마음대로 읽고 변경할 경우 객체의 무결성이 깨어질 수 있기 때문에 외부에서 직접적으로 접근하는 것을 막는다.
상속 (inheritance)
- 상속의 목적은 재사용과 확장
- 상위 객체를 재사용해서 하위 객체를 쉽고 빨리 설계할 수 있도록 도와준다.
- 이미 잘 개발된 객체를 재사용해서 새로운 객체를 만들기 때문 에 중복 코드를 줄여준다.
is a 관계
- 하위 클래스는 상위 클래스이다. (LSP – 리스코프 치환 원칙)
상속에서의 메모리
- 하위 클래스를 생성하면 메모리에 상위 클래스도 함께 적재된다.
다중 상속
- 자바에서는 다중 상속을 지원하지 않는다.
- 다이아몬드 상속 문제 때문
- 사람과 물고기를 확장하고 있는 인어에게 수영을 해보라고 한다면? 사람처럼 다리로 해야 할지, 물고기처럼 지느러미로 해야 할지 알 수 없음.
- 이를 위해 다이아몬드 상속 문제를 일으키지 않는 인터페이스를 제공
인터페이스 (interface)
- 다중 상속 가능.
- 인터페이스의 메서드들은 전부 추상 메서드
- 모든 메서드는 기본적으로 public 접근 제한
- 하위 클래스에서는 implements 키워드를 사용하여 인터페이스를 구현
- 일반 클래스처럼 new 키워드로 생성될 수 없음
- 인터페이스들끼리의 상속 가능
- 인터페이스도 결국에는 컴파일러를 통해 .class 파일로 생성되기 때문에 물리적인 형태는 클래스와 동일
인터페이스 구성 요소
- 상수 필드(Constant Field)
- 추상 메소드(Abstract Method)
- 디폴트 메소드(Default Method)
- 정적 메서드(Static Method)
추상화 (Abstraction)
- 구체적인 것을 분해해서 관심 영역에 대한 특성만을 가지고 재조합 하는 것.
- 관심영역 = 어플리케이션 경계 = 도메인 = 컨텍스트
추상 클래스 (Abstract Class)
- 추상 클래스 (Abstract Class)
- Class 앞에 abstract 키워드를 붙여서 표현
- Abstract와 final 키워드는 함께 사용할 수 없다. (abstract는 변경되도록 하고 final은 변경되지 못하게 하므로 서로 상충됨)
- Abstract 메서드는 하위 클래스에서 반드시 구현해야 함
- 일반 클래스처럼 new 키워드를 사용하여 생성할 수 없음.
추상클래스 vs 인터페이스 차이
- 추상 클래스는 extends, 인터페이스는 implements 키워드 사용
- 추상 클래스는 필드를 가질 수 있지만 인터페이스는 불가능
- Static 변수는 가질 수 있음
- 추상 클래스도 클래스이기 때문에 다중 상속이 불가능
- 다중 상속이 불가능한 제약을 인터페이스로 해결
- 인터페이스는 메서드의 구현 부분과 필드가 없기 때문에 다중 상속 가능
- 추상 클래스는 클래스를 상속받아서 기능을 이용하거나 확장하는 목적
- 인터페이스는 메서드 구현을 강제하여 하위 클래스에게 같은 동작을 행하도록 함
어떤 것을 사용할 것인가?
추상 메소드만으로 가능한 경우에는 인터페이스를, 공통된 구현 부분이나 필드가 필요한 경우에는 추상 클래스를
다형성 (Polymorphism)
- 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질
- 하위 클래스는 상위 클래스나 인터페이스로 자동 타입 변환이 가능
- 하위 클래스로 생성된 인스턴스는 하위 클래스의 객체 참조 변수에 대입되나 상위 클래스의 객체 참조 변수에 대입되나 같은 주소를 가리킨다.
- sub == super (객체 간 == 연산자는 주소 비교)
- 상위 클래스로 변환된 경우 상위 클래스에 선언된 필드와 메서드에만 접근 가능
- 강제 타입 변환(Casting)
- 상위 클래스를 하위 클래스로 강제 변환
- instanceof로 상속관계가 맞는지 확인
- 확인 없이 다른 클래스로 캐스팅하면 ClassCastException 발생
오버라이딩 (Overriding)
- 상속된 메소드의 내용이 하위 클래스에 맞지 않을 경우, 하위 클 래스에서 동일한 메소드를 재정의 하는 것
- 상위 클래스의 메소드는 숨겨지기 때문에 메서드 호출 시 하위 클래스의 메서드가 호출된다.
오버 로딩 (Overloading)
- 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것
- 오버 로딩된 메소드를 호출할 경우 JVM은 매개 값의 타입을 보고 메소드를 선택
static
- 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드
- static 필드와 메서드는 클래스에 고정된 멤버이므로 클래스로 더가 클래스(바이트 코드)를 로딩해서 메서드 메모리 영역에 적재할 때 클래스별로 관리된다
- 클래스 로딩이 끝나면 바로 사용 가능
- static 요소들은 클래스 이름으로 접근하는 것이 좋다
- static 필드는 선언과 동시에 초기값을 주는 것이 보통이지만 초 기화 과정이 복잡한 경우 static 블럭을 사용할 수 있다.
final
- 초기값이 저장되면 프로그램 실행 도중 수정할 수 없다
- static final로 상수 선언
- 상수 이름은 모두 대문자로 하는 것이 관례
- 예 : Math.PI
package
- 클래스를 체계적으로 관리하기 위해 사용
- 클래스를 유일하게 만들어주는 식별자 역할
- 컴파일러는 클래스에 포함되어 있는 패키지 선언을 보고 파일 시스템의 폴더를 자동 생성
- 모두 소문자로 하는 것이 관례
- 숫자로 시작하면 안 되고 _,$를 제외한 특수문자 사용 불가능
- java로 시작하는 패키지는 자바 표준 API에서만 사용하므로 사용 불가
- 보통 회사들 간에 패키지 중복을 피하기 위해 회사 도메인 이름으로 패키지를 만든다.
'Java > JavaCafe Study' 카테고리의 다른 글
5주차 코드 효율성 (0) | 2021.07.11 |
---|---|
4주차 컬렉션 API (0) | 2021.06.27 |
2주차 JAVA API (0) | 2021.05.30 |