SlideShare a Scribd company logo
1 of 65
객체 지향 프로그래밍
Javacafe 최용호
소개
• email : yongho1037@gmail.com
• twitter : yongho1037
• blog : http://yongho1037.tistory.com
• 발표 예제 : https://github.com/YonghoChoi/javacafe-
javastudy-2017.git
알아볼 내용
• 객체지향 프로그래밍
• 객체
• 클래스
• 객체지향의 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

임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
devCAT Studio, NEXON
 
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
KTH, 케이티하이텔
 
Amazon SNS로 지속적 관리가 가능한 대용량 푸쉬 시스템 구축 여정 - AWS Summit Seoul 2017
Amazon SNS로 지속적 관리가 가능한 대용량 푸쉬 시스템 구축 여정 - AWS Summit Seoul 2017Amazon SNS로 지속적 관리가 가능한 대용량 푸쉬 시스템 구축 여정 - AWS Summit Seoul 2017
Amazon SNS로 지속적 관리가 가능한 대용량 푸쉬 시스템 구축 여정 - AWS Summit Seoul 2017
Amazon Web Services Korea
 

What's hot (20)

Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)
 
13 Java Script - Validação de formulário
13 Java Script  - Validação de formulário13 Java Script  - Validação de formulário
13 Java Script - Validação de formulário
 
Momenti Seminar - A Tour of Rust, Part 2
Momenti Seminar - A Tour of Rust, Part 2Momenti Seminar - A Tour of Rust, Part 2
Momenti Seminar - A Tour of Rust, Part 2
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
 
Domain-Driven-Design 정복기 1탄
Domain-Driven-Design 정복기 1탄Domain-Driven-Design 정복기 1탄
Domain-Driven-Design 정복기 1탄
 
d.ts 만들기
d.ts 만들기d.ts 만들기
d.ts 만들기
 
3. 마이크로 서비스 아키텍쳐
3. 마이크로 서비스 아키텍쳐3. 마이크로 서비스 아키텍쳐
3. 마이크로 서비스 아키텍쳐
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven Design
 
190406 신입 클라이언트 프로그래머 1개월차까지 이야기
190406 신입 클라이언트 프로그래머 1개월차까지 이야기190406 신입 클라이언트 프로그래머 1개월차까지 이야기
190406 신입 클라이언트 프로그래머 1개월차까지 이야기
 
Js: master prototypes
Js: master prototypesJs: master prototypes
Js: master prototypes
 
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
 
RESTful API 제대로 만들기
RESTful API 제대로 만들기RESTful API 제대로 만들기
RESTful API 제대로 만들기
 
Amazon SNS로 지속적 관리가 가능한 대용량 푸쉬 시스템 구축 여정 - AWS Summit Seoul 2017
Amazon SNS로 지속적 관리가 가능한 대용량 푸쉬 시스템 구축 여정 - AWS Summit Seoul 2017Amazon SNS로 지속적 관리가 가능한 대용량 푸쉬 시스템 구축 여정 - AWS Summit Seoul 2017
Amazon SNS로 지속적 관리가 가능한 대용량 푸쉬 시스템 구축 여정 - AWS Summit Seoul 2017
 
DDD와 이벤트소싱
DDD와 이벤트소싱DDD와 이벤트소싱
DDD와 이벤트소싱
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법
 
Momenti Seminar - A Tour of Rust, Part 1
Momenti Seminar - A Tour of Rust, Part 1Momenti Seminar - A Tour of Rust, Part 1
Momenti Seminar - A Tour of Rust, Part 1
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유
 
Introduction au Domain Driven Design
Introduction au Domain Driven DesignIntroduction au Domain Driven Design
Introduction au Domain Driven Design
 
[2D1]Elasticsearch 성능 최적화
[2D1]Elasticsearch 성능 최적화[2D1]Elasticsearch 성능 최적화
[2D1]Elasticsearch 성능 최적화
 

Similar to 객체지향 프로그래밍 기본

Smalltalk at Altlang 2008
Smalltalk at Altlang 2008Smalltalk at Altlang 2008
Smalltalk at Altlang 2008
daliot
 
[C++ lab] 3. c++ 프로그래밍
[C++ lab] 3. c++ 프로그래밍[C++ lab] 3. c++ 프로그래밍
[C++ lab] 3. c++ 프로그래밍
MinGeun Park
 
The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표
재정 이
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
Sung-hoon Ma
 
외계어 스터디 3/5 function and object
외계어 스터디 3/5   function and object외계어 스터디 3/5   function and object
외계어 스터디 3/5 function and object
민태 김
 

Similar to 객체지향 프로그래밍 기본 (20)

[자바카페] 자바 객체지향 프로그래밍 (2017)
[자바카페] 자바 객체지향 프로그래밍 (2017)[자바카페] 자바 객체지향 프로그래밍 (2017)
[자바카페] 자바 객체지향 프로그래밍 (2017)
 
Java_05 class
Java_05 classJava_05 class
Java_05 class
 
Java class
Java classJava class
Java class
 
Java script
Java scriptJava script
Java script
 
자바스크립트 프로토타입 및 클래스
자바스크립트 프로토타입 및 클래스자바스크립트 프로토타입 및 클래스
자바스크립트 프로토타입 및 클래스
 
Python class
Python classPython class
Python class
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java
 
Smalltalk at Altlang 2008
Smalltalk at Altlang 2008Smalltalk at Altlang 2008
Smalltalk at Altlang 2008
 
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++ 프로그래밍
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준
 
The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표
 
PHP에서 객체와 데이터 연결 유지
PHP에서 객체와 데이터 연결 유지PHP에서 객체와 데이터 연결 유지
PHP에서 객체와 데이터 연결 유지
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
 
외계어 스터디 3/5 function and object
외계어 스터디 3/5   function and object외계어 스터디 3/5   function and object
외계어 스터디 3/5 function and object
 
Design patterns
Design patternsDesign patterns
Design patterns
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리
 
Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑
 

More from 용호 최

쿠알못이 Amazon EKS로 안정적인 서비스 운영하기 - 최용호
쿠알못이 Amazon EKS로 안정적인 서비스 운영하기 - 최용호쿠알못이 Amazon EKS로 안정적인 서비스 운영하기 - 최용호
쿠알못이 Amazon EKS로 안정적인 서비스 운영하기 - 최용호
용호 최
 

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)
 
[자바카페] 람다 아키텍처, 더 깊이 살펴보기
[자바카페] 람다 아키텍처, 더 깊이 살펴보기[자바카페] 람다 아키텍처, 더 깊이 살펴보기
[자바카페] 람다 아키텍처, 더 깊이 살펴보기
 
[자바카페] 람다 일괄처리 계층 사례
[자바카페] 람다 일괄처리 계층 사례[자바카페] 람다 일괄처리 계층 사례
[자바카페] 람다 일괄처리 계층 사례
 

Recently uploaded

Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)
Wonjun Hwang
 

Recently uploaded (7)

A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)
 
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
 
[Terra] Terra Money: Stability and Adoption
[Terra] Terra Money: Stability and Adoption[Terra] Terra Money: Stability and Adoption
[Terra] Terra Money: Stability and Adoption
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 

객체지향 프로그래밍 기본

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