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
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 시동켜기() {
}
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
20. 객체간의 관계
• 집합 관계
• 하나는 완성품, 하나는 부품.
• 사용 관계
• 객체 간의 상호 작용
• 하나의 객체가 다른 객체의 메소드를 호출하여 원하는 결과를 얻어냄
• 상속 관계
• 상위 객체를 기반으로 하위 객체를 생성하는 관계
• 상위 객체는 종류/분류. 하위 객체는 구체적인 사물에 해당
25. 접근 제한자
• Private
• Protected
• Default
• Public
public
protected
default
private
26. Getter / Setter
• 객체의 데이터를 외부에서 마음대로 읽고 변경할 경우 객체의
무결성이 깨어질 수 있기 때문에 외부에서 직접적으로 접근하는
것을 막는다.
• 데이터는 외부에서 접근할 수 없도록 막고 메소드는 공개해서
외부에서 메서드를 통해 데이터에 접근하도록 유도.
• 필드 타입이 boolean일 경우 is로 시작하는 것이 관례
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에도 구현 메소드를 가짐으로써 다중 상속의 문제점이 다시 불거짐
• 다이아몬드 상속 문제
• 다중 상속 시 명확한 메소드 호출을 위해 상위 인터페이스의 메소드 명시
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