SlideShare a Scribd company logo
1 of 67
객체 지향 프로그래밍
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
참고
• 스프링 입문을 위한
자바 객체지향의 원리와 이해
– 저자 김종민
감사합니다.

More Related Content

What's hot

주니어 개발자도 이해 할 수 있는 Go - Scope 편
주니어 개발자도 이해 할 수 있는 Go - Scope 편주니어 개발자도 이해 할 수 있는 Go - Scope 편
주니어 개발자도 이해 할 수 있는 Go - Scope 편Darion Kim
 
Python class
Python classPython class
Python classHerren
 
Start IoT with JavaScript - 7.프로토타입
Start IoT with JavaScript - 7.프로토타입Start IoT with JavaScript - 7.프로토타입
Start IoT with JavaScript - 7.프로토타입Park Jonggun
 
Effective C++ Chaper 1
Effective C++ Chaper 1Effective C++ Chaper 1
Effective C++ Chaper 1연우 김
 
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++Min-soo Park
 
Effective c++ 챕터 2 정리
Effective c++ 챕터 2 정리Effective c++ 챕터 2 정리
Effective c++ 챕터 2 정리연우 김
 
Java programming pdf
Java programming pdfJava programming pdf
Java programming pdfJi Hoon Lee
 
Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6연우 김
 
Scala self type inheritance
Scala self type inheritanceScala self type inheritance
Scala self type inheritanceYong Joon Moon
 
Scala type class pattern
Scala type class patternScala type class pattern
Scala type class patternYong Joon Moon
 
[새차원, 코틀린(Kotlin) 강좌] 9. Properties and Fields
 [새차원, 코틀린(Kotlin) 강좌] 9. Properties and Fields [새차원, 코틀린(Kotlin) 강좌] 9. Properties and Fields
[새차원, 코틀린(Kotlin) 강좌] 9. Properties and Fields정연 최
 
[새차원, 코틀린(Kotlin) 강좌] 7 classes and_inheritance
[새차원, 코틀린(Kotlin) 강좌] 7 classes and_inheritance[새차원, 코틀린(Kotlin) 강좌] 7 classes and_inheritance
[새차원, 코틀린(Kotlin) 강좌] 7 classes and_inheritance정연 최
 
The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표재정 이
 
Effective c++ 정리 chapter 4
Effective c++ 정리 chapter 4Effective c++ 정리 chapter 4
Effective c++ 정리 chapter 4연우 김
 

What's hot (17)

주니어 개발자도 이해 할 수 있는 Go - Scope 편
주니어 개발자도 이해 할 수 있는 Go - Scope 편주니어 개발자도 이해 할 수 있는 Go - Scope 편
주니어 개발자도 이해 할 수 있는 Go - Scope 편
 
Python class
Python classPython class
Python class
 
Start IoT with JavaScript - 7.프로토타입
Start IoT with JavaScript - 7.프로토타입Start IoT with JavaScript - 7.프로토타입
Start IoT with JavaScript - 7.프로토타입
 
Effective C++ Chaper 1
Effective C++ Chaper 1Effective C++ Chaper 1
Effective C++ Chaper 1
 
Java(1/4)
Java(1/4)Java(1/4)
Java(1/4)
 
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
 
Effective c++ 챕터 2 정리
Effective c++ 챕터 2 정리Effective c++ 챕터 2 정리
Effective c++ 챕터 2 정리
 
Java(2/4)
Java(2/4)Java(2/4)
Java(2/4)
 
Java programming pdf
Java programming pdfJava programming pdf
Java programming pdf
 
Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6
 
Scala self type inheritance
Scala self type inheritanceScala self type inheritance
Scala self type inheritance
 
Scala type class pattern
Scala type class patternScala type class pattern
Scala type class pattern
 
[새차원, 코틀린(Kotlin) 강좌] 9. Properties and Fields
 [새차원, 코틀린(Kotlin) 강좌] 9. Properties and Fields [새차원, 코틀린(Kotlin) 강좌] 9. Properties and Fields
[새차원, 코틀린(Kotlin) 강좌] 9. Properties and Fields
 
[새차원, 코틀린(Kotlin) 강좌] 7 classes and_inheritance
[새차원, 코틀린(Kotlin) 강좌] 7 classes and_inheritance[새차원, 코틀린(Kotlin) 강좌] 7 classes and_inheritance
[새차원, 코틀린(Kotlin) 강좌] 7 classes and_inheritance
 
Javascript
JavascriptJavascript
Javascript
 
The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표
 
Effective c++ 정리 chapter 4
Effective c++ 정리 chapter 4Effective c++ 정리 chapter 4
Effective c++ 정리 chapter 4
 

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

객체지향 프로그래밍 기본
객체지향 프로그래밍 기본객체지향 프로그래밍 기본
객체지향 프로그래밍 기본용호 최
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java유리 하
 
[C++ lab] 3. c++ 프로그래밍
[C++ lab] 3. c++ 프로그래밍[C++ lab] 3. c++ 프로그래밍
[C++ lab] 3. c++ 프로그래밍MinGeun Park
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)Sung-hoon Ma
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13Shin heemin
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준HoJun Sung
 
PHP에서 객체와 데이터 연결 유지
PHP에서 객체와 데이터 연결 유지PHP에서 객체와 데이터 연결 유지
PHP에서 객체와 데이터 연결 유지Yoonwhan Lee
 
외계어 스터디 3/5 function and object
외계어 스터디 3/5   function and object외계어 스터디 3/5   function and object
외계어 스터디 3/5 function and object민태 김
 
Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Younghan Kim
 
불변객체 적용으로 리액트 성능 최적화
불변객체 적용으로 리액트 성능 최적화불변객체 적용으로 리액트 성능 최적화
불변객체 적용으로 리액트 성능 최적화Hun Yong Song
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리Injae Lee
 
토비의 스프링 - DI
토비의 스프링 - DI토비의 스프링 - DI
토비의 스프링 - DIJU Chae
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern대영 노
 
Effective java
Effective javaEffective java
Effective javaHaeil Yi
 

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

객체지향 프로그래밍 기본
객체지향 프로그래밍 기본객체지향 프로그래밍 기본
객체지향 프로그래밍 기본
 
Java_05 class
Java_05 classJava_05 class
Java_05 class
 
Java script
Java scriptJava script
Java script
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java
 
Anatomy of Realm
Anatomy of RealmAnatomy of Realm
Anatomy of Realm
 
[C++ lab] 3. c++ 프로그래밍
[C++ lab] 3. c++ 프로그래밍[C++ lab] 3. c++ 프로그래밍
[C++ lab] 3. c++ 프로그래밍
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준
 
Hello, C# : OOP
Hello, C# : OOPHello, C# : OOP
Hello, C# : OOP
 
PHP에서 객체와 데이터 연결 유지
PHP에서 객체와 데이터 연결 유지PHP에서 객체와 데이터 연결 유지
PHP에서 객체와 데이터 연결 유지
 
외계어 스터디 3/5 function and object
외계어 스터디 3/5   function and object외계어 스터디 3/5   function and object
외계어 스터디 3/5 function and object
 
Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑
 
불변객체 적용으로 리액트 성능 최적화
불변객체 적용으로 리액트 성능 최적화불변객체 적용으로 리액트 성능 최적화
불변객체 적용으로 리액트 성능 최적화
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리
 
토비의 스프링 - DI
토비의 스프링 - DI토비의 스프링 - DI
토비의 스프링 - DI
 
Design patterns
Design patternsDesign patterns
Design patterns
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
 
Effective java
Effective javaEffective java
Effective java
 
Working with code
Working with codeWorking with code
Working with code
 

More from 용호 최

작업공간 - 나만을 위한 카페를 찾는 카페 유목민을 위한 서비스
작업공간 - 나만을 위한 카페를 찾는 카페 유목민을 위한 서비스작업공간 - 나만을 위한 카페를 찾는 카페 유목민을 위한 서비스
작업공간 - 나만을 위한 카페를 찾는 카페 유목민을 위한 서비스용호 최
 
내 주변 작업하기 좋은 카페 찾아주는 웹앱 "작업공간" - CI/CD
내 주변 작업하기 좋은 카페 찾아주는 웹앱 "작업공간" - CI/CD내 주변 작업하기 좋은 카페 찾아주는 웹앱 "작업공간" - CI/CD
내 주변 작업하기 좋은 카페 찾아주는 웹앱 "작업공간" - CI/CD용호 최
 
내 주변 작업하기 좋은 카페 찾아주는 웹앱 "작업공간" - 백엔드 아키텍처
내 주변 작업하기 좋은 카페 찾아주는 웹앱 "작업공간" - 백엔드 아키텍처내 주변 작업하기 좋은 카페 찾아주는 웹앱 "작업공간" - 백엔드 아키텍처
내 주변 작업하기 좋은 카페 찾아주는 웹앱 "작업공간" - 백엔드 아키텍처용호 최
 
빠르고 안정적인 게임 시장 진출을 위한 클라우드 전략 - 최용호
빠르고 안정적인 게임 시장 진출을 위한 클라우드 전략 - 최용호빠르고 안정적인 게임 시장 진출을 위한 클라우드 전략 - 최용호
빠르고 안정적인 게임 시장 진출을 위한 클라우드 전략 - 최용호용호 최
 
쿠알못이 Amazon EKS로 안정적인 서비스 운영하기 - 최용호
쿠알못이 Amazon EKS로 안정적인 서비스 운영하기 - 최용호쿠알못이 Amazon EKS로 안정적인 서비스 운영하기 - 최용호
쿠알못이 Amazon EKS로 안정적인 서비스 운영하기 - 최용호용호 최
 
개발자로써 갖춰야할 스킬들 - 최용호
개발자로써 갖춰야할 스킬들 - 최용호개발자로써 갖춰야할 스킬들 - 최용호
개발자로써 갖춰야할 스킬들 - 최용호용호 최
 
Terraform 입문 - 최용호
Terraform 입문 - 최용호Terraform 입문 - 최용호
Terraform 입문 - 최용호용호 최
 
ElasticStack으로 다양한 수집 아키텍처 구성하기
ElasticStack으로 다양한 수집 아키텍처 구성하기ElasticStack으로 다양한 수집 아키텍처 구성하기
ElasticStack으로 다양한 수집 아키텍처 구성하기용호 최
 
데이터 수집부터 시각화까지
데이터 수집부터 시각화까지데이터 수집부터 시각화까지
데이터 수집부터 시각화까지용호 최
 
[For.D] 개발자 경력을 위한 소프트 스킬 (2019)
[For.D] 개발자 경력을 위한 소프트 스킬 (2019)[For.D] 개발자 경력을 위한 소프트 스킬 (2019)
[For.D] 개발자 경력을 위한 소프트 스킬 (2019)용호 최
 
[DDD] 모바일 게임을 만들기 위한 AWS 고군분투기 (2019)
[DDD] 모바일 게임을 만들기 위한 AWS 고군분투기 (2019)[DDD] 모바일 게임을 만들기 위한 AWS 고군분투기 (2019)
[DDD] 모바일 게임을 만들기 위한 AWS 고군분투기 (2019)용호 최
 
[자바카페] Elasticsearch Aggregation (2018)
[자바카페] Elasticsearch Aggregation (2018)[자바카페] Elasticsearch Aggregation (2018)
[자바카페] Elasticsearch Aggregation (2018)용호 최
 
[GCP Summit 2018] Kubernetes with Nginx and Elasticsearch on GCP
[GCP Summit 2018] Kubernetes with Nginx and Elasticsearch on GCP[GCP Summit 2018] Kubernetes with Nginx and Elasticsearch on GCP
[GCP Summit 2018] Kubernetes with Nginx and Elasticsearch on GCP용호 최
 
[넥슨] kubernetes 소개 (2018)
[넥슨] kubernetes 소개 (2018)[넥슨] kubernetes 소개 (2018)
[넥슨] kubernetes 소개 (2018)용호 최
 
[AWS Summit 2018] 모바일 게임을 만들기 위한 AWS 고군분투기
[AWS Summit 2018] 모바일 게임을 만들기 위한 AWS 고군분투기[AWS Summit 2018] 모바일 게임을 만들기 위한 AWS 고군분투기
[AWS Summit 2018] 모바일 게임을 만들기 위한 AWS 고군분투기용호 최
 
[넥슨토크] 모바일게임 하이브 런칭기 (2018)
[넥슨토크] 모바일게임 하이브 런칭기 (2018)[넥슨토크] 모바일게임 하이브 런칭기 (2018)
[넥슨토크] 모바일게임 하이브 런칭기 (2018)용호 최
 
[자바카페] Infra CI (2018)
[자바카페] Infra CI (2018)[자바카페] Infra CI (2018)
[자바카페] Infra CI (2018)용호 최
 
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)용호 최
 
[자바카페] 람다 아키텍처, 더 깊이 살펴보기
[자바카페] 람다 아키텍처, 더 깊이 살펴보기[자바카페] 람다 아키텍처, 더 깊이 살펴보기
[자바카페] 람다 아키텍처, 더 깊이 살펴보기용호 최
 
[자바카페] 람다 일괄처리 계층 사례
[자바카페] 람다 일괄처리 계층 사례[자바카페] 람다 일괄처리 계층 사례
[자바카페] 람다 일괄처리 계층 사례용호 최
 

More from 용호 최 (20)

작업공간 - 나만을 위한 카페를 찾는 카페 유목민을 위한 서비스
작업공간 - 나만을 위한 카페를 찾는 카페 유목민을 위한 서비스작업공간 - 나만을 위한 카페를 찾는 카페 유목민을 위한 서비스
작업공간 - 나만을 위한 카페를 찾는 카페 유목민을 위한 서비스
 
내 주변 작업하기 좋은 카페 찾아주는 웹앱 "작업공간" - CI/CD
내 주변 작업하기 좋은 카페 찾아주는 웹앱 "작업공간" - CI/CD내 주변 작업하기 좋은 카페 찾아주는 웹앱 "작업공간" - CI/CD
내 주변 작업하기 좋은 카페 찾아주는 웹앱 "작업공간" - CI/CD
 
내 주변 작업하기 좋은 카페 찾아주는 웹앱 "작업공간" - 백엔드 아키텍처
내 주변 작업하기 좋은 카페 찾아주는 웹앱 "작업공간" - 백엔드 아키텍처내 주변 작업하기 좋은 카페 찾아주는 웹앱 "작업공간" - 백엔드 아키텍처
내 주변 작업하기 좋은 카페 찾아주는 웹앱 "작업공간" - 백엔드 아키텍처
 
빠르고 안정적인 게임 시장 진출을 위한 클라우드 전략 - 최용호
빠르고 안정적인 게임 시장 진출을 위한 클라우드 전략 - 최용호빠르고 안정적인 게임 시장 진출을 위한 클라우드 전략 - 최용호
빠르고 안정적인 게임 시장 진출을 위한 클라우드 전략 - 최용호
 
쿠알못이 Amazon EKS로 안정적인 서비스 운영하기 - 최용호
쿠알못이 Amazon EKS로 안정적인 서비스 운영하기 - 최용호쿠알못이 Amazon EKS로 안정적인 서비스 운영하기 - 최용호
쿠알못이 Amazon EKS로 안정적인 서비스 운영하기 - 최용호
 
개발자로써 갖춰야할 스킬들 - 최용호
개발자로써 갖춰야할 스킬들 - 최용호개발자로써 갖춰야할 스킬들 - 최용호
개발자로써 갖춰야할 스킬들 - 최용호
 
Terraform 입문 - 최용호
Terraform 입문 - 최용호Terraform 입문 - 최용호
Terraform 입문 - 최용호
 
ElasticStack으로 다양한 수집 아키텍처 구성하기
ElasticStack으로 다양한 수집 아키텍처 구성하기ElasticStack으로 다양한 수집 아키텍처 구성하기
ElasticStack으로 다양한 수집 아키텍처 구성하기
 
데이터 수집부터 시각화까지
데이터 수집부터 시각화까지데이터 수집부터 시각화까지
데이터 수집부터 시각화까지
 
[For.D] 개발자 경력을 위한 소프트 스킬 (2019)
[For.D] 개발자 경력을 위한 소프트 스킬 (2019)[For.D] 개발자 경력을 위한 소프트 스킬 (2019)
[For.D] 개발자 경력을 위한 소프트 스킬 (2019)
 
[DDD] 모바일 게임을 만들기 위한 AWS 고군분투기 (2019)
[DDD] 모바일 게임을 만들기 위한 AWS 고군분투기 (2019)[DDD] 모바일 게임을 만들기 위한 AWS 고군분투기 (2019)
[DDD] 모바일 게임을 만들기 위한 AWS 고군분투기 (2019)
 
[자바카페] Elasticsearch Aggregation (2018)
[자바카페] Elasticsearch Aggregation (2018)[자바카페] Elasticsearch Aggregation (2018)
[자바카페] Elasticsearch Aggregation (2018)
 
[GCP Summit 2018] Kubernetes with Nginx and Elasticsearch on GCP
[GCP Summit 2018] Kubernetes with Nginx and Elasticsearch on GCP[GCP Summit 2018] Kubernetes with Nginx and Elasticsearch on GCP
[GCP Summit 2018] Kubernetes with Nginx and Elasticsearch on GCP
 
[넥슨] kubernetes 소개 (2018)
[넥슨] kubernetes 소개 (2018)[넥슨] kubernetes 소개 (2018)
[넥슨] kubernetes 소개 (2018)
 
[AWS Summit 2018] 모바일 게임을 만들기 위한 AWS 고군분투기
[AWS Summit 2018] 모바일 게임을 만들기 위한 AWS 고군분투기[AWS Summit 2018] 모바일 게임을 만들기 위한 AWS 고군분투기
[AWS Summit 2018] 모바일 게임을 만들기 위한 AWS 고군분투기
 
[넥슨토크] 모바일게임 하이브 런칭기 (2018)
[넥슨토크] 모바일게임 하이브 런칭기 (2018)[넥슨토크] 모바일게임 하이브 런칭기 (2018)
[넥슨토크] 모바일게임 하이브 런칭기 (2018)
 
[자바카페] Infra CI (2018)
[자바카페] Infra CI (2018)[자바카페] Infra CI (2018)
[자바카페] Infra CI (2018)
 
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
 
[자바카페] 람다 아키텍처, 더 깊이 살펴보기
[자바카페] 람다 아키텍처, 더 깊이 살펴보기[자바카페] 람다 아키텍처, 더 깊이 살펴보기
[자바카페] 람다 아키텍처, 더 깊이 살펴보기
 
[자바카페] 람다 일괄처리 계층 사례
[자바카페] 람다 일괄처리 계층 사례[자바카페] 람다 일괄처리 계층 사례
[자바카페] 람다 일괄처리 계층 사례
 

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

  • 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 시동켜기() { }
  • 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. 객체간의 관계 • 집합 관계 • 하나는 완성품, 하나는 부품. • 사용 관계 • 객체 간의 상호 작용 • 하나의 객체가 다른 객체의 메소드를 호출하여 원하는 결과를 얻어냄 • 상속 관계 • 상위 객체를 기반으로 하위 객체를 생성하는 관계 • 상위 객체는 종류/분류. 하위 객체는 구체적인 사물에 해당
  • 22. 객체지향의 4대 특성 • 캡슐화 (Encapsulation) • 상속(inheritance) • 추상화(Abstraction) • 다형성(Polymorphism)
  • 24. 캡슐화 (Encapsulation) • 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 함 • 정보 은닉 • 변화에 유연한 대응
  • 25. 접근 제한자 • Private • Protected • Default • Public public protected default private
  • 26. Getter / Setter • 객체의 데이터를 외부에서 마음대로 읽고 변경할 경우 객체의 무결성이 깨어질 수 있기 때문에 외부에서 직접적으로 접근하는 것을 막는다. • 데이터는 외부에서 접근할 수 없도록 막고 메소드는 공개해서 외부에서 메서드를 통해 데이터에 접근하도록 유도. • 필드 타입이 boolean일 경우 is로 시작하는 것이 관례
  • 29. 상속 (inheritance) • 상속의 목적은 재사용과 확장 • 상위 객체를 재사용해서 하위 객체를 쉽고 빨리 설계할 수 있도록 도와준다. • 이미 잘 개발된 객체를 재사용해서 새로운 객체를 만들기 때문에 중복 코드를 줄여준다.
  • 30. 상속(inheritance) • 객체지향에서의 상속은 확장이다. • 자바에서의 상속에 해당하는 키워드는 extends 동물 포유류 조류 고래 박쥐 참새 펭귄 구체화 Concrete 추상화 Abstract
  • 32. is a 관계 • 계층도로 생각해보면 is a 관계가 성립하지 않는다. • 나는 아버지? 아버지는 할아버지? • 분류도로 생각해보면 is a 관계가 성립한다. • 고래는 포유류, 포유류는 동물. • 즉, 하위클래스는 상위클래스이다. (LSP – 리스코프 치환 원칙) 동물 포유류 조류 고래 박쥐 참새 펭귄 할아버지 아버지 고모 아들 딸 사촌형 사촌누나 계층도 (x) 분류도 (o)
  • 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. 인터페이스 예제 동물 포유류 조류 고래 박쥐 참새 펭귄 날 수 있는 헤엄칠 수 있는
  • 41. 익명 클래스 (Anonymous Class) • 일회성의 구현 객체를 만들기 위해서 클래스를 새로 선언하는 것은 비효율적 • 소스 파일을 만들지 않고도 구현 객체를 만들 수 있는 방법 • 하나의 메서드를 가진 익명 클래스는 람다로 전환 가능 • 익명 클래스 역시 물리적으로는 컴파일러에 의해 .class 파일로 생성된다. • Classfile1.class 와 같이 뒤에 증가되는 숫자 값으로 파일 생성
  • 44. 추상화 (Abstraction) • 구체적인 것을 분해해서 관심 영역에 대한 특성만을 가지고 재조합 하는 것. • 관심영역 = 어플리케이션 경계 = 도메인 = 컨텍스트 • 추상화 = 모델링 = 클래스 설계 관심영역에 따른 모델링 사람 시력 몸무게 혈액형 키 나이 직업 연봉 먹다() 자다() 일하다() 운전하다() 입금하다() 출금하다() 이체하다() 대출하다() 운동하다() 환자 시력 몸무게 혈액형 키 나이 직업 연봉 먹다() 자다() 일하다() 운전하다() 입금하다() 출금하다() 이체하다() 대출하다() 운동하다() 은행 고객 시력 몸무게 혈액형 키 나이 직업 연봉 먹다() 자다() 일하다() 운전하다() 입금하다() 출금하다() 이체하다() 대출하다() 운동하다()
  • 45. 추상 클래스 (Abstract Class) • 추상 메서드가 하나 이상 포함된 클래스 • Class 앞에 abstract 키워드를 붙여서 표현 • Abstract와 final 키워드는 함께 사용할 수 없다. • Abstract 메서드는 하위 클래스에서 반드시 구현해야 함 • 일반 클래스처럼 new 키워드를 사용하여 생성할 수 없음.
  • 47. 추상클래스 vs 인터페이스 • 추상 클래스는 extends, 인터페이스는 implements 키워드 사용 • 추상 클래스는 필드를 가질 수 있지만 인터페이스는 불가능 • Static 변수는 가질 수 있음. • 추상 클래스도 클래스이기 때문에 다중 상속이 불가능 • 다중 상속이 불가능한 제약을 인터페이스로 해결 • 인터페이스는 메서드의 구현부분과 필드가 없기 때문에 다중상속 가능 • 추상 클래스는 클래스를 상속 받아서 기능을 이용하거나 확장하는 목적 • 인터페이스는 메서드 구현을 강제하여 하위 클래스에게 같은 동작을 행하도록 함
  • 48. 추상 클래스 vs 인터페이스 • 어떤 것을 사용할 것인가? 추상 메소드만으로 가능한 경우에는 인터페이스를, 공통된 구현 부분이나 필드가 필요한 경우에는 추상클래스를
  • 50. 다형성 (Polymorphysm) • 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질 • 하위 클래스는 상위 클래스나 인터페이스로 자동 타입 변환이 가능 • 하위 클래스로 생성된 인스턴스는 하위클래스의 객체 참조변수에 대입되나 상위 클래스의 객체참조변수에 대입되나 같은 주소를 가리킨다. • sub == super (객체간 == 연산자는 주소 비교) • 상위 클래스로 변환된 경우 상위 클래스에 선언된 필드와 메서드에만 접근 가능. • 강제 타입 변환(Casting) • 상위 클래스를 하위 클래스로 강제 변환 • instanceof로 상속관계가 맞는지 확인 • 확인 없이 다른 클래스로 캐스팅 하면 ClassCastException 발생
  • 52. 오버라이딩 (Overriding) • 상속된 메소드의 내용이 하위 클래스에 맞지 않을 경우, 하위 클래스에서 동일한 메소드를 재정의 하는 것 • 상위 클래스의 메소드는 숨겨지기 때문에 메서드 호출 시 하위 클래스의 메서드가 호출된다. • 상위 클래스의 메서드와 동일한 시그너처를 가져야한다. • 접근 제한을 더 강하게 오버라이딩 할 수 없다. • 새로운 예외를 throws할 수 없다.
  • 53. 오버 로딩 (Overloading) • 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것 • 오버로딩 된 메소드를 호출할 경우 JVM은 매개값의 타입을 보고 메소드를 선택 • 타입이 일치하지 않을 경우 타입 변환이 가능한지 검사
  • 54. 오버라이딩과 오버로딩의 혼돈 • 라이딩 = 타다, 로딩 = 적재하다. • 올라타서 아랫부분이 보이지 않으므로 재정의 => 오버라이딩 • 적재해서 뒤로 계속 늘어나므로 동일한 이름의 메서드가 늘어나는 것을 연상 => 오버로딩
  • 56. 그 외call by value/reference, static, final, package
  • 57. Call By • Call By Value : 값에 의한 전달 • 기본 자료형은 저장하고 있는 값이 전달(복사) 된다. • 대입문 사용시 / 인자 전달 시 / 메서드 리턴 시 • Call By Reference : 참조/주소에 의한 전달 • 객체참조변수에 주소값을 대입하여 힙영역에 존재하는 객체 참조 • 포인터
  • 59. static • 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드 • static 필드와 메서드는 클래스에 고정된 멤버이므로 클래스 로더가 클래스(바이트 코드)를 로딩해서 메서드 메모리영역에 적재할 때 클래스별로 관리된다. • 클래스 로딩이 끝나면 바로 사용 가능
  • 60. static • static 요소들은 클래스 이름으로 접근하는 것이 좋다. • 인스턴스를 통해 접근할 경우 인스턴스를 먼저 훑고나서 없는 걸 확인한 후 클래스를 참조하기 때문에 하나의 스텝이 더 생긴다. • static 필드는 선언과 동시에 초기값을 주는 것이 보통이지만 초기화 과정이 복잡한 경우 static 블럭을 사용할 수 있다. • 클래스가 메모리로 로딩 될 때 자동으로 수행된다. • 인스턴스가 없어도 실행되기 때문에 인스턴스 필드나 메소드, this 키워드를 사용할 수 없다.
  • 61. 인스턴스 vs static • 인스턴스 필드 vs static 필드 • 객체마다 가지고 있어야 할 데이터라면 인스턴스 필드로 선언 • 객체마다 가지고 있을 필요성이 없는 공용적인 데이터라면 static 필드로 선언 • 인스턴스 메서드 vs static 메서드 • 인스턴스 필드를 이용해서 실행해야 한다면 인스턴스 메서드로 선언 • 인스턴스 필드를 이용하지 않는 다면 static 메서드로 선언
  • 63. final • 초기값이 저장되면 프로그램 실행 도중 수정할 수 없다. • 필드 선언시 초기화를 하거나 생성자에서 초기화를 수행해야 한다. • 그렇지 않으면 컴파일 에러 • static final로 상수 선언 • 클래스에만 포함되며 값을 변경할 수 없다. • 필드 선언시 초기화를 하거나 static 블럭에서 초기화를 수행해야 한다. • 상수 이름은 모두 대문자로 하는 것이 관례 • 예 : Math.PI • final 메서드 : 오버라이딩 불가능 • final class : 상속 불가능
  • 65. package • 클래스를 체계적으로 관리하기 위해 사용 • 클래스를 유일하게 만들어주는 식별자 역할 • 컴파일러는 클래스에 포함되어 있는 패키지 선언을 보고 파일 시스템의 폴더를 자동 생성 • 모두 소문자로 하는 것이 관례 • 숫자로 시작하면 안되고 _,$를 제외한 특수문자 사용 불가능 • java로 시작하는 패키지는 자바 표준 API에서만 사용하므로 사용 불가 • 보통 회사들 간에 패키지 중복을 피하기 위해 회사 도메인 이름으로 패키지를 만든다. • 포괄적인 이름이 상위 패키지가 되도록 도메인의 역순으로 이름을 짓는다. • 마지막에는 프로젝트 이름을 붙여주는 것이 관례 • ex) com.javacafe.javastudy
  • 66. 참고 • 스프링 입문을 위한 자바 객체지향의 원리와 이해 – 저자 김종민