객체 지향 프로그래밍
Javacafe 최용호
소개
• email : yongho1037@gmail.com
• twitter : yongho1037
• blog : http://yongho1037.tistory.com
• 발표 예제 : https://github.com/YonghoChoi/javacafe-javastudy-
2017.git
참여 프로젝트
• 하이브 (2016~2017)
• 화이트데이 (2016)
• 클럽 엠스타 온라인 (2015~2016)
• 와리가리 삼총사 (2014~2015)
• 어스토니시아 VS (2013~2014)
• 다함께 차차차 (2013)
• 어스토니시아 스토리 온라인 (2012~2013)
• 열혈강호2 온라인 (2010~2012)
알아볼 내용
• 객체지향 프로그래밍
• 객체
• 클래스
• 객체지향의 4대 특성
• 캡슐화
• 접근제한자
• getter/setter
• 상속
• 다중 상속
• 인터페이스
• 추상화
• 추상클래스
• 다형성
• 오버라이딩/오버로딩
• static
• final
• package
객체지향 프로그래밍
(OOP : Object-Oriented Programming)
• 객체 지향 프로그래밍(영어: Object-Oriented Programming,
OOP)은 컴퓨터 프로그래밍의 패러다임의 하나이다.
• 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나
여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는
것이다.
• 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
- 위키피디아
객체지향 프로그래밍이란?
객체(Object)란?
• 실세계와 비교하자면 세상에 존재하는 모든 사물이 객체.
• 저장 공간에 할당된 공간
• 객체 참조 변수를 통해 해당 공간에 접근
• 하나의 클래스를 통해 다수의 객체가 생성되지만 각각의 객체는
고유함.
• 속성 + 행위
클래스(Class) 란?
• 같은 속성들과 기능들을 가진 객체들을 총칭하는 개념
• 이 개념적인 클래스를 통해 실체화 된 것이 객체(인스턴스).
• 객체는 필드(Field)와 메소드(Method)를 가진다.
• 클래스를 통해 실체화된 객체는 필드를 통해 고유한 속성을 가지고 메소드로 행위를
한다.
클래스 객체참조변수명 = new 클래스();
new 연산자를 통해 객체가 메모리에 할당되고
해당 객체의 생성자가 호출된다.
클래스 구성 멤버
• 필드
• 생성자
• 메소드
class 자동차 {
String 이름;
public 자동차() {
}
public void 시동켜기() {
}
}
필드(Field)
• 라이프 싸이클
• 필드는 객체 소멸 시 함께 소멸
• 변수는 생성자 또는 메서드 수행이 종료되면 소멸
• 초기화
• 필드 선언 시
• 필드의 초기 값이 모든 객체에 대해 동일한 경우
• 생성자에서
• 객체 생성 시점에 외부의 값으로 대입이 필요한 경우
class 자동차 {
public 자동차() {
}
public void 시동켜기() {
}
}
String 이름;
생성자
• new 연산자로 호출되며,
객체 생성 시 초기화를 담당.
• 클래스 이름으로 되어 있고 리턴타입이 없다.
• 명시 하지 않으면 JVM이 기본 생성자 생성.
• 상속 관계에서 객체 생성은 상위클래스가 먼저 초기화 되고 하위
클래스가 초기화 된다.
class 자동차 {
String name;
public void 시동켜기() {
}
}
public 자동차() {
}
메소드 (Method)
• 객체의 동작에 해당하며 해당 객체의 필드를 읽고 수정하는
역할과 객체간의 상호작용 역할
• 외부로부터 값을 받을 수도 있고 실행 후 외부로 값을 반환 할
수도 있다.
• 선언부와 실행 블록으로 구성
• 선언부를 시그너처라고도 한다.
• 시그너처 : 반환타입, 메소드명, 매개변수
public void pay ( int money ) {
System.out.println(money + “원을 지불하였습니다.”);
}
반환타입 메소드명
매개변수 class 자동차 {
String name;
public 자동차() {
}
}
public void 시동켜기() {
}
Demooop.object.Example1~2
메모리 영역
클래스 객체참조변수명 = new 클래스();
메모리 영역
클래스 객체참조변수명 = new 클래스();
class 자동차 {
public String name;
}
메모리 영역
클래스 객체참조변수명 = new 클래스();
자동차 myCar = new 자동차();
class 자동차 {
public String name;
}
메모리 영역
클래스 객체참조변수명 = new 클래스();
자동차 myCar = new 자동차();
class 자동차 {
public String name;
}
객체 vs 클래스
• 클래스는 메소드 영역에
• 객체는 힙 영역에
• 객체의 메소드가 수행되면 스택
프레임이 생성
• 메소드 내의 지역변수들은 스택
프레임의 스택에 쌓임
메소드 영역
스택 영역 힙 영역
Main
main(args: String[])
자동차
name: String
Main() 스택 프레임
myCar
args
자동차
Name
객체간의 관계
사람 자동차
기계
엔진 타이어 핸들
사용 관계
집합 관계
상속 관계
객체간의 관계
• 집합 관계
• 하나는 완성품, 하나는 부품.
• 사용 관계
• 객체 간의 상호 작용
• 하나의 객체가 다른 객체의 메소드를 호출하여 원하는 결과를 얻어냄
• 상속 관계
• 상위 객체를 기반으로 하위 객체를 생성하는 관계
• 상위 객체는 종류/분류. 하위 객체는 구체적인 사물에 해당
객체지향의 4대 특성
객체지향의 4대 특성
• 캡슐화 (Encapsulation)
• 상속(inheritance)
• 추상화(Abstraction)
• 다형성(Polymorphism)
캡슐화
(Encapsulation)
캡슐화 (Encapsulation)
• 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 함
• 정보 은닉
• 변화에 유연한 대응
접근 제한자
• Private
• Protected
• Default
• Public
public
protected
default
private
Getter / Setter
• 객체의 데이터를 외부에서 마음대로 읽고 변경할 경우 객체의
무결성이 깨어질 수 있기 때문에 외부에서 직접적으로 접근하는
것을 막는다.
• 데이터는 외부에서 접근할 수 없도록 막고 메소드는 공개해서
외부에서 메서드를 통해 데이터에 접근하도록 유도.
• 필드 타입이 boolean일 경우 is로 시작하는 것이 관례
Demooop.encapsulation.Example1
상속
(inheritance)
상속 (inheritance)
• 상속의 목적은 재사용과 확장
• 상위 객체를 재사용해서 하위 객체를 쉽고 빨리 설계할 수
있도록 도와준다.
• 이미 잘 개발된 객체를 재사용해서 새로운 객체를 만들기 때문에
중복 코드를 줄여준다.
상속(inheritance)
• 객체지향에서의 상속은 확장이다.
• 자바에서의 상속에 해당하는 키워드는 extends
동물
포유류 조류
고래 박쥐 참새 펭귄 구체화
Concrete
추상화
Abstract
Demooop.inheritance1.Example1
is a 관계
• 계층도로 생각해보면 is a 관계가 성립하지 않는다.
• 나는 아버지? 아버지는 할아버지?
• 분류도로 생각해보면 is a 관계가 성립한다.
• 고래는 포유류, 포유류는 동물.
• 즉, 하위클래스는 상위클래스이다. (LSP – 리스코프 치환 원칙)
동물
포유류 조류
고래 박쥐 참새 펭귄
할아버지
아버지 고모
아들 딸 사촌형 사촌누나
계층도 (x) 분류도 (o)
Demooop.inheritance.Example2
상속에서의 메모리
• 하위 클래스를 생성하면 메모리에 상위클래스도 함께 적재된다.
메소드 영역
스택 영역 힙 영역
Main
main(args: String[])
동물
name: String
showName() : void
펭귄
habitat: String
showHabitat() : void
Main() 스택 프레임
pororo
args
펭귄
Habitat
showHabitat()
동물
Name
showName()
null null
다중 상속
• 자바에서는 다중 상속을 지원하지 않는다.
• 다이아몬드 상속 문제 때문.
• 사람과 물고기를 확장하고 있는 인어에게 수영을 해보라고 한다면?
사람처럼 다리로 해야할지, 물고기처럼 지느러미로 해야할지 알 수 없음.
• 이를 위해 다이아몬드 상속 문제를 일으키지 않는 인터페이스를 제공
인어
사람 물고기
인터페이스 (interface)
• 다중 상속 가능.
• 인터페이스의 메서드들은 전부 추상 메서드
• 모든 메서드는 기본적으로 public 접근 제한
• 하위 클래스에서는 implements 키워드를 사용하여
인터페이스를 구현
• 일반 클래스처럼 new 키워드로 생성될 수 없음.
• 인터페이스들끼리의 상속 가능
• 인터페이스도 결국에는 컴파일러를 통해 .class 파일로 생성되기
때문에 물리적인 형태는 클래스와 동일
인터페이스 구성 요소
• 상수 필드(Constant Field)
• 추상 메소드(Abstract Method)
• 인터페이스에 선언된 메서드는 모두 public abstract를 붙인 것과 같음.
• 디폴트 메소드(Default Method)
• 자바8
• 기존 인터페이스를 확장해서 새로운 기능을 추가하기 위해서 사용
• 정적 메서드(Static Method)
• 자바8
• 인터페이스만으로 호출 가능
인터페이스의 default 메소드
• java8에서 함수형 프로그래밍 요소들이 들어오면서 하위호환성을 위해
불가피하게 추가
• ex) List
• interface에도 구현 메소드를 가짐으로써 다중 상속의 문제점이 다시 불거짐
• 다이아몬드 상속 문제
• 다중 상속 시 명확한 메소드 호출을 위해 상위 인터페이스의 메소드 명시
인터페이스 예제
동물
포유류 조류
고래 박쥐 참새 펭귄
날 수 있는
헤엄칠 수 있는
Demooop.interfaces.Example1~2
익명 클래스 (Anonymous Class)
• 일회성의 구현 객체를 만들기 위해서 클래스를 새로 선언하는
것은 비효율적
• 소스 파일을 만들지 않고도 구현 객체를 만들 수 있는 방법
• 하나의 메서드를 가진 익명 클래스는 람다로 전환 가능
• 익명 클래스 역시 물리적으로는 컴파일러에 의해 .class 파일로
생성된다.
• Classfile1.class 와 같이 뒤에 증가되는 숫자 값으로 파일 생성
Demooop.anonymous_class.Example1~2
추상화
(Abstraction)
추상화 (Abstraction)
• 구체적인 것을 분해해서 관심 영역에 대한 특성만을 가지고 재조합 하는 것.
• 관심영역 = 어플리케이션 경계 = 도메인 = 컨텍스트
• 추상화 = 모델링 = 클래스 설계
관심영역에 따른 모델링
사람
시력
몸무게
혈액형
키
나이
직업
연봉
먹다()
자다()
일하다()
운전하다()
입금하다()
출금하다()
이체하다()
대출하다()
운동하다()
환자
시력
몸무게
혈액형
키
나이
직업
연봉
먹다()
자다()
일하다()
운전하다()
입금하다()
출금하다()
이체하다()
대출하다()
운동하다()
은행 고객
시력
몸무게
혈액형
키
나이
직업
연봉
먹다()
자다()
일하다()
운전하다()
입금하다()
출금하다()
이체하다()
대출하다()
운동하다()
추상 클래스 (Abstract Class)
• 추상 메서드가 하나 이상 포함된 클래스
• Class 앞에 abstract 키워드를 붙여서 표현
• Abstract와 final 키워드는 함께 사용할 수 없다.
• Abstract 메서드는 하위 클래스에서 반드시 구현해야 함
• 일반 클래스처럼 new 키워드를 사용하여 생성할 수 없음.
Demooop.inheritance.Example3
추상클래스 vs 인터페이스
• 추상 클래스는 extends, 인터페이스는 implements 키워드 사용
• 추상 클래스는 필드를 가질 수 있지만 인터페이스는 불가능
• Static 변수는 가질 수 있음.
• 추상 클래스도 클래스이기 때문에 다중 상속이 불가능
• 다중 상속이 불가능한 제약을 인터페이스로 해결
• 인터페이스는 메서드의 구현부분과 필드가 없기 때문에 다중상속 가능
• 추상 클래스는 클래스를 상속 받아서 기능을 이용하거나 확장하는 목적
• 인터페이스는 메서드 구현을 강제하여 하위 클래스에게 같은 동작을 행하도록 함
추상 클래스 vs 인터페이스
• 어떤 것을 사용할 것인가?
추상 메소드만으로 가능한 경우에는 인터페이스를,
공통된 구현 부분이나 필드가 필요한 경우에는 추상클래스를
다형성
(Polymorphysm)
다형성 (Polymorphysm)
• 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질
• 하위 클래스는 상위 클래스나 인터페이스로 자동 타입 변환이 가능
• 하위 클래스로 생성된 인스턴스는 하위클래스의 객체 참조변수에 대입되나
상위 클래스의 객체참조변수에 대입되나 같은 주소를 가리킨다.
• sub == super (객체간 == 연산자는 주소 비교)
• 상위 클래스로 변환된 경우 상위 클래스에 선언된 필드와 메서드에만 접근 가능.
• 강제 타입 변환(Casting)
• 상위 클래스를 하위 클래스로 강제 변환
• instanceof로 상속관계가 맞는지 확인
• 확인 없이 다른 클래스로 캐스팅 하면 ClassCastException 발생
Demooop.polymorphysm.Example1~2
오버라이딩 (Overriding)
• 상속된 메소드의 내용이 하위 클래스에 맞지 않을 경우, 하위
클래스에서 동일한 메소드를 재정의 하는 것
• 상위 클래스의 메소드는 숨겨지기 때문에 메서드 호출 시 하위
클래스의 메서드가 호출된다.
• 상위 클래스의 메서드와 동일한 시그너처를 가져야한다.
• 접근 제한을 더 강하게 오버라이딩 할 수 없다.
• 새로운 예외를 throws할 수 없다.
오버 로딩 (Overloading)
• 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것
• 오버로딩 된 메소드를 호출할 경우 JVM은 매개값의 타입을 보고
메소드를 선택
• 타입이 일치하지 않을 경우 타입 변환이 가능한지 검사
오버라이딩과 오버로딩의 혼돈
• 라이딩 = 타다, 로딩 = 적재하다.
• 올라타서 아랫부분이 보이지 않으므로 재정의 => 오버라이딩
• 적재해서 뒤로 계속 늘어나므로 동일한 이름의 메서드가
늘어나는 것을 연상 => 오버로딩
Demooop.polymorphysm.Example2
그 외call by value/reference, static, final, package
Call By
• Call By Value : 값에 의한 전달
• 기본 자료형은 저장하고 있는 값이 전달(복사) 된다.
• 대입문 사용시 / 인자 전달 시 / 메서드 리턴 시
• Call By Reference : 참조/주소에 의한 전달
• 객체참조변수에 주소값을 대입하여 힙영역에 존재하는 객체 참조
• 포인터
Demooop.etc.Example1
static
• 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는
필드와 메소드
• static 필드와 메서드는 클래스에 고정된 멤버이므로 클래스
로더가 클래스(바이트 코드)를 로딩해서 메서드 메모리영역에
적재할 때 클래스별로 관리된다.
• 클래스 로딩이 끝나면 바로 사용 가능
static
• static 요소들은 클래스 이름으로 접근하는 것이 좋다.
• 인스턴스를 통해 접근할 경우 인스턴스를 먼저 훑고나서 없는 걸 확인한
후 클래스를 참조하기 때문에 하나의 스텝이 더 생긴다.
• static 필드는 선언과 동시에 초기값을 주는 것이 보통이지만
초기화 과정이 복잡한 경우 static 블럭을 사용할 수 있다.
• 클래스가 메모리로 로딩 될 때 자동으로 수행된다.
• 인스턴스가 없어도 실행되기 때문에 인스턴스 필드나 메소드, this
키워드를 사용할 수 없다.
인스턴스 vs static
• 인스턴스 필드 vs static 필드
• 객체마다 가지고 있어야 할 데이터라면 인스턴스 필드로 선언
• 객체마다 가지고 있을 필요성이 없는 공용적인 데이터라면 static 필드로
선언
• 인스턴스 메서드 vs static 메서드
• 인스턴스 필드를 이용해서 실행해야 한다면 인스턴스 메서드로 선언
• 인스턴스 필드를 이용하지 않는 다면 static 메서드로 선언
Demooop.etc.Example2
final
• 초기값이 저장되면 프로그램 실행 도중 수정할 수 없다.
• 필드 선언시 초기화를 하거나 생성자에서 초기화를 수행해야 한다.
• 그렇지 않으면 컴파일 에러
• static final로 상수 선언
• 클래스에만 포함되며 값을 변경할 수 없다.
• 필드 선언시 초기화를 하거나 static 블럭에서 초기화를 수행해야 한다.
• 상수 이름은 모두 대문자로 하는 것이 관례
• 예 : Math.PI
• final 메서드 : 오버라이딩 불가능
• final class : 상속 불가능
Demooop.etc.Example3
package
• 클래스를 체계적으로 관리하기 위해 사용
• 클래스를 유일하게 만들어주는 식별자 역할
• 컴파일러는 클래스에 포함되어 있는 패키지 선언을 보고 파일 시스템의 폴더를 자동 생성
• 모두 소문자로 하는 것이 관례
• 숫자로 시작하면 안되고 _,$를 제외한 특수문자 사용 불가능
• java로 시작하는 패키지는 자바 표준 API에서만 사용하므로 사용 불가
• 보통 회사들 간에 패키지 중복을 피하기 위해 회사 도메인 이름으로 패키지를 만든다.
• 포괄적인 이름이 상위 패키지가 되도록 도메인의 역순으로 이름을 짓는다.
• 마지막에는 프로젝트 이름을 붙여주는 것이 관례
• ex) com.javacafe.javastudy
참고
• 스프링 입문을 위한
자바 객체지향의 원리와 이해
– 저자 김종민
감사합니다.

[자바카페] 자바 객체지향 프로그래밍 (2017)

  • 1.
  • 2.
    소개 • email :yongho1037@gmail.com • twitter : yongho1037 • blog : http://yongho1037.tistory.com • 발표 예제 : https://github.com/YonghoChoi/javacafe-javastudy- 2017.git
  • 3.
    참여 프로젝트 • 하이브(2016~2017) • 화이트데이 (2016) • 클럽 엠스타 온라인 (2015~2016) • 와리가리 삼총사 (2014~2015) • 어스토니시아 VS (2013~2014) • 다함께 차차차 (2013) • 어스토니시아 스토리 온라인 (2012~2013) • 열혈강호2 온라인 (2010~2012)
  • 4.
    알아볼 내용 • 객체지향프로그래밍 • 객체 • 클래스 • 객체지향의 4대 특성 • 캡슐화 • 접근제한자 • getter/setter • 상속 • 다중 상속 • 인터페이스 • 추상화 • 추상클래스 • 다형성 • 오버라이딩/오버로딩 • static • final • package
  • 5.
    객체지향 프로그래밍 (OOP :Object-Oriented Programming)
  • 6.
    • 객체 지향프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임의 하나이다. • 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. • 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. - 위키피디아 객체지향 프로그래밍이란?
  • 7.
    객체(Object)란? • 실세계와 비교하자면세상에 존재하는 모든 사물이 객체. • 저장 공간에 할당된 공간 • 객체 참조 변수를 통해 해당 공간에 접근 • 하나의 클래스를 통해 다수의 객체가 생성되지만 각각의 객체는 고유함. • 속성 + 행위
  • 8.
    클래스(Class) 란? • 같은속성들과 기능들을 가진 객체들을 총칭하는 개념 • 이 개념적인 클래스를 통해 실체화 된 것이 객체(인스턴스). • 객체는 필드(Field)와 메소드(Method)를 가진다. • 클래스를 통해 실체화된 객체는 필드를 통해 고유한 속성을 가지고 메소드로 행위를 한다. 클래스 객체참조변수명 = new 클래스(); new 연산자를 통해 객체가 메모리에 할당되고 해당 객체의 생성자가 호출된다.
  • 9.
    클래스 구성 멤버 •필드 • 생성자 • 메소드 class 자동차 { String 이름; public 자동차() { } public void 시동켜기() { } }
  • 10.
    필드(Field) • 라이프 싸이클 •필드는 객체 소멸 시 함께 소멸 • 변수는 생성자 또는 메서드 수행이 종료되면 소멸 • 초기화 • 필드 선언 시 • 필드의 초기 값이 모든 객체에 대해 동일한 경우 • 생성자에서 • 객체 생성 시점에 외부의 값으로 대입이 필요한 경우 class 자동차 { public 자동차() { } public void 시동켜기() { } } String 이름;
  • 11.
    생성자 • new 연산자로호출되며, 객체 생성 시 초기화를 담당. • 클래스 이름으로 되어 있고 리턴타입이 없다. • 명시 하지 않으면 JVM이 기본 생성자 생성. • 상속 관계에서 객체 생성은 상위클래스가 먼저 초기화 되고 하위 클래스가 초기화 된다. class 자동차 { String name; public void 시동켜기() { } } public 자동차() { }
  • 12.
    메소드 (Method) • 객체의동작에 해당하며 해당 객체의 필드를 읽고 수정하는 역할과 객체간의 상호작용 역할 • 외부로부터 값을 받을 수도 있고 실행 후 외부로 값을 반환 할 수도 있다. • 선언부와 실행 블록으로 구성 • 선언부를 시그너처라고도 한다. • 시그너처 : 반환타입, 메소드명, 매개변수 public void pay ( int money ) { System.out.println(money + “원을 지불하였습니다.”); } 반환타입 메소드명 매개변수 class 자동차 { String name; public 자동차() { } } public void 시동켜기() { }
  • 13.
  • 14.
  • 15.
    메모리 영역 클래스 객체참조변수명= new 클래스(); class 자동차 { public String name; }
  • 16.
    메모리 영역 클래스 객체참조변수명= new 클래스(); 자동차 myCar = new 자동차(); class 자동차 { public String name; }
  • 17.
    메모리 영역 클래스 객체참조변수명= new 클래스(); 자동차 myCar = new 자동차(); class 자동차 { public String name; }
  • 18.
    객체 vs 클래스 •클래스는 메소드 영역에 • 객체는 힙 영역에 • 객체의 메소드가 수행되면 스택 프레임이 생성 • 메소드 내의 지역변수들은 스택 프레임의 스택에 쌓임 메소드 영역 스택 영역 힙 영역 Main main(args: String[]) 자동차 name: String Main() 스택 프레임 myCar args 자동차 Name
  • 19.
    객체간의 관계 사람 자동차 기계 엔진타이어 핸들 사용 관계 집합 관계 상속 관계
  • 20.
    객체간의 관계 • 집합관계 • 하나는 완성품, 하나는 부품. • 사용 관계 • 객체 간의 상호 작용 • 하나의 객체가 다른 객체의 메소드를 호출하여 원하는 결과를 얻어냄 • 상속 관계 • 상위 객체를 기반으로 하위 객체를 생성하는 관계 • 상위 객체는 종류/분류. 하위 객체는 구체적인 사물에 해당
  • 21.
  • 22.
    객체지향의 4대 특성 •캡슐화 (Encapsulation) • 상속(inheritance) • 추상화(Abstraction) • 다형성(Polymorphism)
  • 23.
  • 24.
    캡슐화 (Encapsulation) • 외부의잘못된 사용으로 인해 객체가 손상되지 않도록 함 • 정보 은닉 • 변화에 유연한 대응
  • 25.
    접근 제한자 • Private •Protected • Default • Public public protected default private
  • 26.
    Getter / Setter •객체의 데이터를 외부에서 마음대로 읽고 변경할 경우 객체의 무결성이 깨어질 수 있기 때문에 외부에서 직접적으로 접근하는 것을 막는다. • 데이터는 외부에서 접근할 수 없도록 막고 메소드는 공개해서 외부에서 메서드를 통해 데이터에 접근하도록 유도. • 필드 타입이 boolean일 경우 is로 시작하는 것이 관례
  • 27.
  • 28.
  • 29.
    상속 (inheritance) • 상속의목적은 재사용과 확장 • 상위 객체를 재사용해서 하위 객체를 쉽고 빨리 설계할 수 있도록 도와준다. • 이미 잘 개발된 객체를 재사용해서 새로운 객체를 만들기 때문에 중복 코드를 줄여준다.
  • 30.
    상속(inheritance) • 객체지향에서의 상속은확장이다. • 자바에서의 상속에 해당하는 키워드는 extends 동물 포유류 조류 고래 박쥐 참새 펭귄 구체화 Concrete 추상화 Abstract
  • 31.
  • 32.
    is a 관계 •계층도로 생각해보면 is a 관계가 성립하지 않는다. • 나는 아버지? 아버지는 할아버지? • 분류도로 생각해보면 is a 관계가 성립한다. • 고래는 포유류, 포유류는 동물. • 즉, 하위클래스는 상위클래스이다. (LSP – 리스코프 치환 원칙) 동물 포유류 조류 고래 박쥐 참새 펭귄 할아버지 아버지 고모 아들 딸 사촌형 사촌누나 계층도 (x) 분류도 (o)
  • 33.
  • 34.
    상속에서의 메모리 • 하위클래스를 생성하면 메모리에 상위클래스도 함께 적재된다. 메소드 영역 스택 영역 힙 영역 Main main(args: String[]) 동물 name: String showName() : void 펭귄 habitat: String showHabitat() : void Main() 스택 프레임 pororo args 펭귄 Habitat showHabitat() 동물 Name showName() null null
  • 35.
    다중 상속 • 자바에서는다중 상속을 지원하지 않는다. • 다이아몬드 상속 문제 때문. • 사람과 물고기를 확장하고 있는 인어에게 수영을 해보라고 한다면? 사람처럼 다리로 해야할지, 물고기처럼 지느러미로 해야할지 알 수 없음. • 이를 위해 다이아몬드 상속 문제를 일으키지 않는 인터페이스를 제공 인어 사람 물고기
  • 36.
    인터페이스 (interface) • 다중상속 가능. • 인터페이스의 메서드들은 전부 추상 메서드 • 모든 메서드는 기본적으로 public 접근 제한 • 하위 클래스에서는 implements 키워드를 사용하여 인터페이스를 구현 • 일반 클래스처럼 new 키워드로 생성될 수 없음. • 인터페이스들끼리의 상속 가능 • 인터페이스도 결국에는 컴파일러를 통해 .class 파일로 생성되기 때문에 물리적인 형태는 클래스와 동일
  • 37.
    인터페이스 구성 요소 •상수 필드(Constant Field) • 추상 메소드(Abstract Method) • 인터페이스에 선언된 메서드는 모두 public abstract를 붙인 것과 같음. • 디폴트 메소드(Default Method) • 자바8 • 기존 인터페이스를 확장해서 새로운 기능을 추가하기 위해서 사용 • 정적 메서드(Static Method) • 자바8 • 인터페이스만으로 호출 가능
  • 38.
    인터페이스의 default 메소드 •java8에서 함수형 프로그래밍 요소들이 들어오면서 하위호환성을 위해 불가피하게 추가 • ex) List • interface에도 구현 메소드를 가짐으로써 다중 상속의 문제점이 다시 불거짐 • 다이아몬드 상속 문제 • 다중 상속 시 명확한 메소드 호출을 위해 상위 인터페이스의 메소드 명시
  • 39.
    인터페이스 예제 동물 포유류 조류 고래박쥐 참새 펭귄 날 수 있는 헤엄칠 수 있는
  • 40.
  • 41.
    익명 클래스 (AnonymousClass) • 일회성의 구현 객체를 만들기 위해서 클래스를 새로 선언하는 것은 비효율적 • 소스 파일을 만들지 않고도 구현 객체를 만들 수 있는 방법 • 하나의 메서드를 가진 익명 클래스는 람다로 전환 가능 • 익명 클래스 역시 물리적으로는 컴파일러에 의해 .class 파일로 생성된다. • Classfile1.class 와 같이 뒤에 증가되는 숫자 값으로 파일 생성
  • 42.
  • 43.
  • 44.
    추상화 (Abstraction) • 구체적인것을 분해해서 관심 영역에 대한 특성만을 가지고 재조합 하는 것. • 관심영역 = 어플리케이션 경계 = 도메인 = 컨텍스트 • 추상화 = 모델링 = 클래스 설계 관심영역에 따른 모델링 사람 시력 몸무게 혈액형 키 나이 직업 연봉 먹다() 자다() 일하다() 운전하다() 입금하다() 출금하다() 이체하다() 대출하다() 운동하다() 환자 시력 몸무게 혈액형 키 나이 직업 연봉 먹다() 자다() 일하다() 운전하다() 입금하다() 출금하다() 이체하다() 대출하다() 운동하다() 은행 고객 시력 몸무게 혈액형 키 나이 직업 연봉 먹다() 자다() 일하다() 운전하다() 입금하다() 출금하다() 이체하다() 대출하다() 운동하다()
  • 45.
    추상 클래스 (AbstractClass) • 추상 메서드가 하나 이상 포함된 클래스 • Class 앞에 abstract 키워드를 붙여서 표현 • Abstract와 final 키워드는 함께 사용할 수 없다. • Abstract 메서드는 하위 클래스에서 반드시 구현해야 함 • 일반 클래스처럼 new 키워드를 사용하여 생성할 수 없음.
  • 46.
  • 47.
    추상클래스 vs 인터페이스 •추상 클래스는 extends, 인터페이스는 implements 키워드 사용 • 추상 클래스는 필드를 가질 수 있지만 인터페이스는 불가능 • Static 변수는 가질 수 있음. • 추상 클래스도 클래스이기 때문에 다중 상속이 불가능 • 다중 상속이 불가능한 제약을 인터페이스로 해결 • 인터페이스는 메서드의 구현부분과 필드가 없기 때문에 다중상속 가능 • 추상 클래스는 클래스를 상속 받아서 기능을 이용하거나 확장하는 목적 • 인터페이스는 메서드 구현을 강제하여 하위 클래스에게 같은 동작을 행하도록 함
  • 48.
    추상 클래스 vs인터페이스 • 어떤 것을 사용할 것인가? 추상 메소드만으로 가능한 경우에는 인터페이스를, 공통된 구현 부분이나 필드가 필요한 경우에는 추상클래스를
  • 49.
  • 50.
    다형성 (Polymorphysm) • 같은타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질 • 하위 클래스는 상위 클래스나 인터페이스로 자동 타입 변환이 가능 • 하위 클래스로 생성된 인스턴스는 하위클래스의 객체 참조변수에 대입되나 상위 클래스의 객체참조변수에 대입되나 같은 주소를 가리킨다. • sub == super (객체간 == 연산자는 주소 비교) • 상위 클래스로 변환된 경우 상위 클래스에 선언된 필드와 메서드에만 접근 가능. • 강제 타입 변환(Casting) • 상위 클래스를 하위 클래스로 강제 변환 • instanceof로 상속관계가 맞는지 확인 • 확인 없이 다른 클래스로 캐스팅 하면 ClassCastException 발생
  • 51.
  • 52.
    오버라이딩 (Overriding) • 상속된메소드의 내용이 하위 클래스에 맞지 않을 경우, 하위 클래스에서 동일한 메소드를 재정의 하는 것 • 상위 클래스의 메소드는 숨겨지기 때문에 메서드 호출 시 하위 클래스의 메서드가 호출된다. • 상위 클래스의 메서드와 동일한 시그너처를 가져야한다. • 접근 제한을 더 강하게 오버라이딩 할 수 없다. • 새로운 예외를 throws할 수 없다.
  • 53.
    오버 로딩 (Overloading) •클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것 • 오버로딩 된 메소드를 호출할 경우 JVM은 매개값의 타입을 보고 메소드를 선택 • 타입이 일치하지 않을 경우 타입 변환이 가능한지 검사
  • 54.
    오버라이딩과 오버로딩의 혼돈 •라이딩 = 타다, 로딩 = 적재하다. • 올라타서 아랫부분이 보이지 않으므로 재정의 => 오버라이딩 • 적재해서 뒤로 계속 늘어나므로 동일한 이름의 메서드가 늘어나는 것을 연상 => 오버로딩
  • 55.
  • 56.
    그 외call byvalue/reference, static, final, package
  • 57.
    Call By • CallBy Value : 값에 의한 전달 • 기본 자료형은 저장하고 있는 값이 전달(복사) 된다. • 대입문 사용시 / 인자 전달 시 / 메서드 리턴 시 • Call By Reference : 참조/주소에 의한 전달 • 객체참조변수에 주소값을 대입하여 힙영역에 존재하는 객체 참조 • 포인터
  • 58.
  • 59.
    static • 클래스에 고정된멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드 • static 필드와 메서드는 클래스에 고정된 멤버이므로 클래스 로더가 클래스(바이트 코드)를 로딩해서 메서드 메모리영역에 적재할 때 클래스별로 관리된다. • 클래스 로딩이 끝나면 바로 사용 가능
  • 60.
    static • static 요소들은클래스 이름으로 접근하는 것이 좋다. • 인스턴스를 통해 접근할 경우 인스턴스를 먼저 훑고나서 없는 걸 확인한 후 클래스를 참조하기 때문에 하나의 스텝이 더 생긴다. • static 필드는 선언과 동시에 초기값을 주는 것이 보통이지만 초기화 과정이 복잡한 경우 static 블럭을 사용할 수 있다. • 클래스가 메모리로 로딩 될 때 자동으로 수행된다. • 인스턴스가 없어도 실행되기 때문에 인스턴스 필드나 메소드, this 키워드를 사용할 수 없다.
  • 61.
    인스턴스 vs static •인스턴스 필드 vs static 필드 • 객체마다 가지고 있어야 할 데이터라면 인스턴스 필드로 선언 • 객체마다 가지고 있을 필요성이 없는 공용적인 데이터라면 static 필드로 선언 • 인스턴스 메서드 vs static 메서드 • 인스턴스 필드를 이용해서 실행해야 한다면 인스턴스 메서드로 선언 • 인스턴스 필드를 이용하지 않는 다면 static 메서드로 선언
  • 62.
  • 63.
    final • 초기값이 저장되면프로그램 실행 도중 수정할 수 없다. • 필드 선언시 초기화를 하거나 생성자에서 초기화를 수행해야 한다. • 그렇지 않으면 컴파일 에러 • static final로 상수 선언 • 클래스에만 포함되며 값을 변경할 수 없다. • 필드 선언시 초기화를 하거나 static 블럭에서 초기화를 수행해야 한다. • 상수 이름은 모두 대문자로 하는 것이 관례 • 예 : Math.PI • final 메서드 : 오버라이딩 불가능 • final class : 상속 불가능
  • 64.
  • 65.
    package • 클래스를 체계적으로관리하기 위해 사용 • 클래스를 유일하게 만들어주는 식별자 역할 • 컴파일러는 클래스에 포함되어 있는 패키지 선언을 보고 파일 시스템의 폴더를 자동 생성 • 모두 소문자로 하는 것이 관례 • 숫자로 시작하면 안되고 _,$를 제외한 특수문자 사용 불가능 • java로 시작하는 패키지는 자바 표준 API에서만 사용하므로 사용 불가 • 보통 회사들 간에 패키지 중복을 피하기 위해 회사 도메인 이름으로 패키지를 만든다. • 포괄적인 이름이 상위 패키지가 되도록 도메인의 역순으로 이름을 짓는다. • 마지막에는 프로젝트 이름을 붙여주는 것이 관례 • ex) com.javacafe.javastudy
  • 66.
    참고 • 스프링 입문을위한 자바 객체지향의 원리와 이해 – 저자 김종민
  • 67.