• 검색 결과가 없습니다.

제 제 3 3 장 장 객체지향 객체지향 프로그래밍 프로그래밍

N/A
N/A
Protected

Academic year: 2022

Share "제 제 3 3 장 장 객체지향 객체지향 프로그래밍 프로그래밍"

Copied!
112
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

프로그래머를

프로그래머를 위한 위한 Java 2 Java 2

제 제 3 3 장 장 객체지향 객체지향 프로그래밍 프로그래밍

(2)

Chap.3

Software Components

2

Software Components

z

Programs are easier to construct and modify

† they are made up of separate components

z

A software component can be thought of

† any program element that transforms input into output

Input Component Output

15 38

16 Compute 22

average

(3)

Chap.3

Software Components

3

Software Components

z

Components can be combined to make larger components

(4)

Chap.3

Object

4

Object - - Oriented Programming Oriented Programming

z

Java is object-oriented language

z

Programs are made from software components called objects

z

Initially, we can think of an object as

† data for it and a collection of services

z Object

† contains data and methods to provide the service

(5)

Chap.3

Object

5

Object - - Oriented Programming Oriented Programming

z Class

† A class represents a concept

† An object is defined by a class

† Multiple objects can be created from the same class

(6)

Chap.3

Object

6

Object - - Oriented Programming Oriented Programming

z A class represents a concept and

z an object represents the realization of that concept

Objects

Car

My first car

John's car

Dad's car

Class

(7)

Chap.3

3.1.1

7

3.1.1 객체와 객체와 클래스 클래스 개념 개념

z

용어 정리

† 객체(object)

 실세계 혹은 인간의 생각 속에 존재하는 사물 혹은 개념

† 추상화(abstraction)

객체들의 공통된 특성을 파악하고, 불필요한 특성을 제거하는 과정

† 클래스(class)

추상화를 통해서 객체들의 공통된 사항을 모아놓은 것

† 멤버 필드(속성)

클래스의 특성 중에서 변수 혹은 값으로 표현할 수 있는 것

† 메소드(멤버 함수, 행위)

클래스의 특성 중에서 함수로 표현할 수 있는 것

† 캡슐화(encapsulation)

클래스의 특성을 외부에서 접근하지 못하도록 한 것

(8)

Chap.3

3.1

8

3.1 객체지향 객체지향 개념 개념

† 정보 은폐

멤버 필드와 메소드를 클래스의 외부에서는 접근하지 못하도록 하는 기능

† 상속

새로운 클래스를 정의할 때, 이미 존재하는 클래스를 바탕으로 필요한 속성만 추가하여 작성하는 방법

† 서브 클래스

상속을 통해 새로 정의되는 클래스

† 슈퍼 클래스

상속에서 바탕이 되는 클래스

(9)

Chap.3

3.1.1

9

3.1.1 객체와 객체와 클래스 클래스 개념 개념

z

추상화

(10)

Chap.3

3.1

10

3.1 객체지향 객체지향 개념 개념

z

객체지향 프로그래밍의 장점

† 생산성 향성

객체를 하드웨어의 IC처럼 재사용

† 자연적인 모델링

보통 사람들의 생각을 프로그래밍 언어로 표현

† 재사용

상속성, 클래스 통합을 통한 코드 재상용의 극대화

† 유지보수의 용이성

함수 수정에 있어 주변에 미치는 영향이 최소화됨

(11)

Chap.3

3.1.1

11

3.1.1 객체와 객체와 클래스 클래스 개념 개념

z

실세계 객체와 프로그램 세계의 클래스

(12)

Chap.3

3.1.1

12

3.1.1 객체와 객체와 클래스 클래스 개념 개념

z

프로그램 세계에서 클래스와 객체

† 객체

Object = Data + Methods

Object = 클래스의 인스턴스 (an instance of a class)

† 클래스

Class = 객체의 타입 (description of a type of Object)

† 프로그램

Program = 서로 협력하는 객체들의 집합

(a set of Objects invoking each other Methods)

(13)

Chap.3

실세계의

13

실세계의 객체와 객체와 컴퓨터상의 컴퓨터상의 객체 객체

(14)

Chap.3

3.1.1

14

3.1.1 객체와 객체와 클래스 클래스 개념 개념 (Message Passing) (Message Passing)

z

메시지 패싱

운전자

페달

엔진

바퀴

객체

객체

객체

Car 클래스

페달을 밟았다.

힘 좀 더 내봐

빨리 돌아라

Car

Engine engine;

Pedal pedal;

Wheel wheel;

engine powerUp(){

}

wheel.speedUp() pedal

push(){

}

engine.powerUp();

wheel speedUp(){

...

...

}

Driver

Car car;

car.pedal.push()

(15)

Chap.3

객체간의

15

객체간의 의사소통 의사소통 : : 메시지 메시지 패싱 패싱

z

실세계에서 메시지 패싱

운전자

페달

엔진

바퀴

객체

객체

객체

Car 클래스

페달을 밟았다.

힘 좀 더 내봐

빨리 돌아라

(16)

Chap.3

객체간의

16

객체간의 의사소통 의사소통 : : 메시지 메시지 패싱 패싱

z 자바 언어에서 메시지 패싱

† 메시지 패싱 방법을 사용

† 대부분의 프로그래밍 언어에서는 함수 호출을 이용

Car

Engine engine;

Pedal pedal;

Wheel wheel;

engine

powerUp(){

}

wheel.speedUp() pedal

push(){

}

engine.powerUp();

wheel

speedUp(){

...

...

}

Driver

Car car;

car.pedal.push()

(17)

Chap.3

3.1.2

17

3.1.2 클래스와 클래스와 객체 객체 만들기 만들기

z

추상화 관점

(18)

Chap.3

3.1.2

18

3.1.2 클래스와 클래스와 객체 객체 만들기 만들기

1. 정의 단계

† 클래스 -> 틀, 자료형

† 클래스를 정의할 때 사물(객체, 물건)의 중요하고 필요하다고 판단되는 특성과 기능만 추출해서 표현한다.

2. 생성 (실체화) 단계

† new 라는 명령어를 사용, new 다음에 클래스 이름과 같은 함수 기술

† 이 때 만들어진 실체(객체)는 변수에 저장되고, 변수의 타입은 실체의 종류가 될 것이다.

† 예: Pen mypen = new Pen();

3. 사용 단계

† 변수에 점(.)을 이용하여 프로그램에서 생성된 객체를 사용한다.

† 예: mypen.write();

(19)

Chap.3

3.1.2

19

3.1.2 클래스와 클래스와 객체 객체 만들기 만들기

z

프로그램에서 클래스를 정의하고 사용하는 단계

1. 공장(생산라인)을 만든다.

2. 물건을 만든다.

3. 물건을 이용(사용)한다.

특성

중요한 추출 기능

프로그램으로 표현

class Pen { String color;

int price;

void write() {

System.out.println("Hello");

} } Pen mypen =

new Pen();

mypen.write();

(20)

Chap.3

3.1.2

20

3.1.2 클래스와 클래스와 객체 객체 만들기 만들기

z

예제 : Pen.java

z

예제 : PenUser.java

1 class Pen { 2 String color;

3 int price;

4

5 void write() {

6 System.out.println("Hello");

7 } 8 }

1 class PenUser {

2 public static void main(String args[]) { 3 Pen mypen = new Pen();

4 mypen.write();

5 } 6 }

z

결과

C:\> java PenUser Hello

-Method Invocation -Message passing

(21)

Chap.3

3.1.3

21

3.1.3 레퍼런스 레퍼런스 타입 타입

z

레퍼런스와 포인터

(22)

Chap.3

3.1.3

22

3.1.3 레퍼런스 레퍼런스 타입 타입

z

객체 생성 방법 (C++ vs. Java)

(23)

Chap.3

3.1.3

23

3.1.3 레퍼런스 레퍼런스 타입 타입

z

메모리 영역

1 int a = 100 ; 2 Car mycar;

3 mycar = new Car();

4 Car yourcar = mycar;

(24)

Chap.3

3.2

24

3.2 자바 자바 클래스 클래스

z

자바 클래스 작성 문법

[ classmodifier ] class name [ <typeparameter> ] [ extends name ]

[ implements name [ , name ] ] {

[[ constructormodifier ] name ( argumentlist )

[ throws name [ , name ] ] { } ]

[ fieldmodifier ] type name [ = initialvalue ] ;

[ methodmodifier ] [ <typeparameter> ] returntype name ( argumentlist ) [ throws name [ , name ] ] { }

}

(25)

Chap.3

3.2

25

3.2 자바 자바 클래스 클래스

z

모디파이어 종류

(26)

Chap.3

3.2

26

3.2 자바 자바 클래스 클래스

z

예제 : Circle1.java

1 class Circle {

2 protected int r;

3

4 public double getCircumference() { 5 return 3.14*2*r;

6 } 7

8 public double getArea() { 9 return 3.14*r*r;

10 } 11

12 public int getRadius() { 13 return r;

14 } 15

16 public void setRadius(int r) { 17 this.r = r;

………..

(27)

Chap.3

3.2

27

3.2 자바 자바 클래스 클래스

z

예제 : CircleUser1.java

1 class CircleUser {

2 public static void main(String args[]) { 3 Circle c = new Circle();

4 c.setRadius(7);

5 System.out.println("원 둘레:"+ c.getCircumference());

6 System.out.println("원 면적:"+ c.getArea());

……

z

결과

C:\> java CircleUser 원 둘레:43.96

원 면적:153.86

(28)

Chap.3

3.3.1

28

3.3.1 생성자 생성자

z

생성자

† 클래스 이름과 동일한 이름을 갖는 함수

† 생성자의 리턴 타입은 기술하지 않음

† 역할 - 멤버 필드의 초기화

† 생성자가 없는 클래스는 디폴트 생성자를 가지고 있다

(29)

Chap.3

3.3.1

29

3.3.1 생성자 생성자

z

예제 : Circle2.java

z

예제 : CircleUser2.java

1 class Circle {

……

8 public Circle(int r) { 9 this.r = r;

10 }

1 class CircleUser {

2 public static void main(String args[]) { 3 Circle c = new Circle(7);

4 System.out.println("원 둘레:"+ c.getCircumference());

5 System.out.println("원 면적:"+ c.getArea());

(30)

Chap.3

3.3.2 this

30

3.3.2 this

z

this

† 클래스 내에서 자기 자신을 가리키는 레퍼런스

† static으로 선언된 메소드에서는 사용될 수 없다.

† 두 가지 목적으로 사용

자기 자신의 멤버 필드나 메소드를 명확히 지시하기 위해서 사용

객체 전체를 함수의 매개변수로 전달해야 하는 경우에 사용

z

예제 : This.java

9 void a (int a) { 10 this.a = a;

11 b.doJob(this);

12 } 13 }

(31)

Chap.3

3.3.3 this()

31

3.3.3 this()

z

this( )

† 생성자에서 사용되는 this()는 클래스의 다른 생성자를 호출

† 생성자가 많은 경우 매개 변수에 의해 생성자가 구분

† 생성자에서 this()는 맨 처음 부분에 나와야 한다.

z

예제 : Circle3.java

4 public Circle() { 5 this(0);

6 }

8 public Circle(int r) { 9 this.r = r;

10 }

(32)

Chap.3

3.3.5

32

3.3.5 패키지와 패키지와 import import

z

패키지 (package)

† 유사한 클래스들의 모임

† package 문장 기술

package package_name ;

† 특징

package 문장을 사용하지 않는 경우에는 디폴트 패키지에 속하게 된다.

패키지 내에서 클래스들은 서로 자유롭게 다른 클래스들을 참조

다른 패키지의 클래스를 사용하기 위해서는 import 문을 사용 import package_name.class_name ;

패키지 경로는 클래스 파일의 디렉토리 경로와 같다. 예) java.awt.Graphics --> java/awt/Graphics

import 문장을 사용하지 않고 다른 패키지의 클래스를 참조하기 위해서는 패키지 이름과 클래스 이름을 같이 사용

예) java.awt.Graphics g ;

(33)

Chap.3

3.3.5

33

3.3.5 패키지와 패키지와 import import

z

예제 : ColorPen.java

z

저장 및 컴파일

† 저장

C:\java2\src\ch3\com\coding_free\java2

† 컴파일

C:\> javac -d . com/coding_free/java2/ColorPen.java 1 package com.coding_free.java2;

2

3 public class ColorPen { 4 private String color;

5 private int price;

(34)

Chap.3

3.3.5

34

3.3.5 패키지와 패키지와 import import

z

예제 : ColorPenUsre.java

z

저장 , 컴파일 및 실행

† 저장 : C:\java2\src\ch3\penna

† 컴파일 : C:\> javac -d . penna/ColorPenUser.java

† 실행 : C:\> java penna.ColorPenUser 1 package penna;

2

3 import com.coding_free.java2.*;

4

5 class ColorPenUser {

6 public static void main(String args[]) { 7 ColorPen mypen = new ColorPen();

(35)

Chap.3

3.3.5

35

3.3.5 패키지와 패키지와 import import

z

Static import

† 클래스의 static 멤버 필드와 메소드를 임포트할 수 있는 기능

† 형태

z

예제 : StaticImportTest.java

1 import static java.lang.System.*;

2

3 public class StaticImportTest {

4 public static void main(String args[]) { 5 out.println("Hello World");

import static TypeName.Identifier ; import static TypeName.* ;

(36)

Chap.3

3.4 public

36

3.4 public 클래스 클래스

z

public 클래스의 의미

† public으로 선언된 경우

같은 패키지 내에서 자유롭게 사용.

다른 패키지에서도 자유롭게 사용.

† public으로 선언되지 않은 경우

같은 패키지 내에서는 자유롭게 사용

다른 패키지에서 접근 시 에러가 발생

(37)

Chap.3

3.5

37

3.5 가시성 가시성

z

가시성

† 멤버 필드와 메소드에 적용 z

가시성 종류

† public

클래스 내외 어느 곳에서나 접근이 가능

† protected

같은 패키지 내에 있는 클래스들은 모두 접근 가능

다른 패키지의 클래스들은 이 클래스로부터 상속받은 경우에만 접근

가능

† package

아무 것도 기술하지 않음

같은 패키지 내에서는 자유롭게 접근할 수 있으나, 패키지 외부에서는 접근할 수 없음

† private

클래스 내부에서만 접근 가능

(38)

Chap.3

3.5

38

3.5 가시성 가시성

z

동일 패키지

z

외부 패키지

protected public private default

class class

class

O O

X O class

상속

상속 O

O X

O

class

package

protected public private

default class class

class class

상속

상속

class

X O

X X O

O

X X

package

(39)

Chap.3

3.6 transient, volatile

39

3.6 transient, volatile 필드 필드

3.6.1 transient 필드

† ‘멤버필드가 객체의 영속적인 상태에 일부분으로 포함되지 않는다’

예 )

† 다음의 Point 클래스가 시스템 서비스에 의해 영속적인 메모리에

저장될 때 transient 부분을 제외한 x, y 부분만 저장됨을 의미한다.

class Point { int x, y;

transient float rho, theta;

}

† transient는 현재까지 세부적인 내용은 결정되지 않았고, 앞으로 세부적인 사항들이 결정될 예정

(40)

Chap.3

3.6 transient, volatile

40

3.6 transient, volatile 필드 필드

3.6.2 volatile 필드

† 쓰레드 간에 공유되는 데이터의 일관성 유지를 위해 사용

† volatile로 선언된 변수는 일관성을 유지하면서 내용이 업데이트 됨

† volatile로 선언된 변수의 내용을 변경하는 경우에는 락(lock)이 걸린다고 볼 수 있다.

예: class Test {

static volatile int i = 0, j = 0;

static void one() { i++; j++; } static void two() {

System.out.println("i=" + i + " j=" + j);

…………..

† i, j 변수에 volatile을 선언하는 것은 i, j 값을 변경하는 one(), two() 메소드에 synchronized를 선언하는 것과 같은 효과를 가져온다.

(41)

Chap.3

3.7

41

3.7 오버로딩 오버로딩 (overloading) (overloading)

z

오버로딩

† ad-hoc polymorphism이라고도 함

† 동일한 연산자가 자료의 타입에 따라 다른 작업을 수행하는 것

† 함수 오버로딩

동일한 이름을 가지는 함수가 여러 개 존재 가능

내부적으로는 다른 작업을 하더라도 의미 면에서 같다면 동일한 함수

이름을 사용

한 클래스 내에서 함수 이름은 동일, 함수의 매개변수는 달라야 함

함수 시그내쳐 = 함수 이름 + 매개 변수 개수 + 매개 변수 타입

(42)

Chap.3

3.7

42

3.7 오버로딩 오버로딩 (overloading) (overloading)

† 함수의 이름은 같아도 시그니쳐(signiture)는 달라야 한다.

시그니쳐(signiture) - 함수 이름, 아규먼트의 수, 아규먼트의 타입

동일한 함수 이름을 사용하면 컴파일러가 시그니쳐를 이용해서

다른 이름으로 변경해서 컴파일

z 함수 이름이 동일하고 시그니쳐도 동일하다면 컴파일 에러 발생

함수의 리턴 타입은 시그니쳐에 포함되지 않음

† 예제: Overloading.java

한 클래스 내에서 함수 이름은 동일하지만,

함수의 아규먼트(아규먼트의 수, 아규먼트의 타입)가 다른 경우

(43)

Chap.3

3.7

43

3.7 오버로딩 오버로딩 (overloading) (overloading)

예제 : Overloading.java

1 class Overloading { 2 public void say() {

3 System.out.println("Hello ?");

4 }

6 public void say(String msg) { 7 System.out.println(msg);

8 }

10 public void say(String msg, int n) { 11 for(int i =0; i < n; i++) {

12 System.out.println(msg);

13 } 14 }

16 public static void main(String args[]) { 17 Overloading a = new Overloading();

18 a.say();

19 a.say("How are you ?");

20 a.say("I am fine.", 3);

…………...

(44)

Chap.3

3.7

44

3.7 오버로딩 오버로딩 (overloading) (overloading)

z

폴리모피즘

† 동일한 내용이 다른 타입에 적용 가능

† 기원 – 함수형 언어에서 시작됨

예: 리스트의 크기를 알아보는 length 함수는 리스트 내부의 데이터 타입에 관계없이 적용되고, Int 타입의 값을 리턴한다.

length :: [a] -> Int // Hakell 언어 문법

† 종류

Parametric polymorphism

z 데이터 타입과 무관하게 동일한 코드로 작동 – 코드 재사용

z 함수형 언어의 폴리모피즘

z 자바의 제네릭 프로그래밍, C++의 template

Ad-hoc polymorphism

z 데이터 타입에 따라 다른 코드가 수행 – 문법 재사용

z 연산자 혹은 함수 오버로딩

(45)

Chap.3

4.1

45

4.1 상속 상속

z 상속

† 기존에 있는 클래스를 바탕으로 다른 특성을 추가해 새로운 클래스를 생성

 서브 클래스(subclass), 파생 클래스(derived class), 자식 클래스(child class)

 슈퍼 클래스 (superclass), 베이스 클래스 (baseclass), 부모 클래스 (parent class)

† is - a 관계

 "Human is an animal."에서 human과 animal과의 관계

 human은 animal에 속하면서 animal의 모든 속성을 상속받음

 is - a가 성립하는 경우에 상속이 가능하다.

† 서브 클래스는 슈퍼 클래스의 서브타입 (subtype)

† 자바에서는 상속을 위해서 extends라는 키워드를 사용

† 자바는 단일 상속(single inheritance)만 지원

 하나의 슈퍼 클래스로부터 상속받음

cf) 다중상속다중상속 –– C++C++

(46)

Chap.3

4.1.1

46

4.1.1 상속 상속

z

사원과 관리자의 예

† Employee 클래스

멤버 필드: 이름, 사번, 직책, 월급

메소드: 일하다

† Manager 클래스

멤버 필드: 이름, 사번, 직책, 월급, 부서

메소드: 일하다

(47)

Chap.3

4.1.1

47

4.1.1 상속 상속

z

Employee와 Manager의 관계

† is-a 관계

A manager is an employee.

† 상속 관계

Employee : 슈퍼 클래스, 부모 클래스

Manager : 서브 클래스, 자식 클래스

† 자바에서 상속

extends 키워드 사용

(48)

Chap.3

4.1.1

48

4.1.1 상속 상속

z

예제 : Employee.java

1 class Employee {

2 protected String name;

3 protected String idnum;

7 public Employee(String name, String idnum) { 8 this.name = name;

9 this.idnum = idnum;

20 public void work() {

21 System.out.println("₩tEmployee ₩""+name + "₩" does his best.");

22 }

(49)

Chap.3

4.1.1

49

4.1.1 상속 상속

z

예제 : Manager.java

1 class Manager extends Employee { 2 String dept;

4 public Manager(String name, String idnum, String dept) { 5 super(name, idnum);

6 this.dept = dept;

7 } 8

9 public void work() {

10 System.out.println("Manager ₩""+name +

11 "₩" works hard with his subordinates in "+dept+“dept.");

12 }

(50)

Chap.3

4.1.1

50

4.1.1 상속 상속

z

예제 : Company.java

7 jmchoi = new Manager(“Yoon Yong", "F99847", "Finance");

10 lee = new Employee("lee", "F94732");

12 employees = new Employee[4];

13 employees[0] = yiyoon;

14 employees[1] = sblim;

19 public void makeMoney() { 20 int n = employees.length;

21 for(int i=0; i < n; i++) { 22 employees[i].work();

23 }

(51)

Chap.3

4.1.2 super

51

4.1.2 super 와 와 super() super()

z

super

† super는 슈퍼 클래스를 지칭하는 레퍼런스로 사용

상위 클래스의 멤버 필드나 메소드를 지칭할 때 사용

z super.attribute

z super.method()

static으로 선언된 메소드에서는 사용될 수 없다.

z

super()

† super()는 슈퍼 클래스의 생성자를 호출

† super()는 생성자의 맨 처음 부분에 위치

† 자식 클래스의 생성자는 슈퍼클래스의 생성자를 호출해야 한다.

슈퍼클래스의 생성자를 호출하지 않는 경우에는 내부에서 자동적으로

슈퍼클래스의 디폴트 생성자가 호출

(52)

Chap.3

4.1.3

52

4.1.3 오버라이딩 오버라이딩

z

오버라이딩 (overriding)

† 클래스의 상속관계에서 발생

† 슈퍼 클래스에 있는 메소드를 서브 클래스에서 다른 작업을 하도록 서브클래스에서 동일한

함수 이름으로 재정의

cf) 오버로딩(overloading)

† static으로 선언한 클래스 메소드에서는 오버라이딩 되지 않는다.

† 예외 상황을 발생시킬 수 있는 메소드는 오버라이딩 할 수 없다.

† 예 class Employee {

public void work() {

System.out.println("₩tEmployee ₩""+name + “….");

} }

class Manager extends Employee { public void work() {

System.out.println("Manager ₩""+name + "...");

(53)

Chap.3

4.1.4

53

4.1.4 상속 상속 , , 오버라이딩 오버라이딩 , , 우버쉐도우 우버쉐도우

z

예제 : A.java

2 int a = 10;

4 void b() {

5 System.out.println("A");

z

예제 : AA.java

1 class AA extends A { 2 int a = 20;

3 void b()

4 System.out.println("AA");

5

6 void c() {

7 System.out.println("C");

(54)

Chap.3

4.1.4

54

4.1.4 상속 상속 , , 오버라이딩 오버라이딩 , , 우버쉐도우 우버쉐도우

z

메모리 구조

A

AA

a 10 b()

a 20

c()

void b() { ..("A") }

void b() { ..("AA") }

void c() { ..("C") }

z

(55)

Chap.3

4.1.4

55

4.1.4 상속 상속 , , 오버라이딩 오버라이딩 , , 우버쉐도우 우버쉐도우

msg 출력 z

예제 : XYZ.java

(56)

Chap.3

4.1.4

56

4.1.4 상속 상속 , , 오버라이딩 오버라이딩 , , 우버쉐도우 우버쉐도우

z

예제 : XYZ.java

40 Z z = new Z();

41 Y y = z;

42 X x = z;

43 z.print();

44 y.print();

45 super.print();

46 play();

47 super.play();

48 // y.doZ();

49 // super.super.print();

(57)

Chap.3

4.1.4

57

4.1.4 상속 상속 , , 오버라이딩 오버라이딩 , , 우버쉐도우 우버쉐도우

z

예제 : XYZ.java(계속)

51 System.out.println("₩ni ="+ i);

52 System.out.println("this.i = "+ this.i);

53 System.out.println("super.i = "+ super.i);

54 System.out.println("y.i = "+ y.i);

55 System.out.println("x.i = "+ x.i);

56 System.out.println("((Y)this).i = "+ ((Y)this).i);

57 System.out.println("((X)this).i = "+ ((X)this).i);

58 // super.super.i = 10;

(58)

Chap.3

4.1.4

58

4.1.4 상속 상속 , , 오버라이딩 오버라이딩 , , 우버쉐도우 우버쉐도우

z

결과 : XYZ.java

C:₩> java Z I am a Z.

I am a Z.

I am an Y.

Play..I am a Z.

Play..I am an X.

i =15

this.i = 30 super.i = 20 y.i = 20

x.i = 10

((Y)this).i = 20 ((X)this).i = 10

(59)

Chap.3

4.1.4

59

4.1.4 상속 상속 , , 오버라이딩 오버라이딩 , , 오버쉐도우 오버쉐도우

z

오버라이딩 (overriding)

† 주의 사항

가시성은 커지는 방향으로

예외 throws 문제

리턴 타입이 다른 경우

z

오버쉐도우 (overshadow)

† 동일한 이름의 멤버 필드가 슈퍼클래스와 서브클래스에 있을 때

† 오버쉐도우된 멤버 필드는 super 레퍼런스를 이용하거나, 서브 클래스를 슈퍼클래스로 형 변환해서 접근할 수 있다.

(60)

Chap.3

PolyMorphism

60

PolyMorphism

z

Poly : 많다는 뜻의 접두어

z

Morphism : 형태라는 뜻

z

Polymorphism : 형태가 많다는 뜻

† 의미(Semantics)는 하나지만 실제 형태는 여러가지가 될 수 있음.

예) 밥을 먹다: 누가 밥을 먹는 가에 다양한 형태가 존재

† 객체지향 프로그래밍에서 polymorphism의 지원 형태

Overloading

Overriding

(61)

Chap.3

4.2.1

61

4.2.1 클래스에서 클래스에서 형변환 형변환

z

슈퍼 타입과 슈퍼 클래스

† 슈퍼 타입 ≒ 슈퍼 클래스

같은 개념은 아니지만, 자바/C++ 등의 언어에서는 같다고 보아도 무방함

z

(62)

Chap.3

4.2.1

62

4.2.1 클래스에서 클래스에서 형변환 형변환

z

예제 : ReferenceCast.java

9 animal1 = new Animal();

10 mammal1 = new Mammal();

11 ape1 = new Ape();

12 human1 = new Human();

13

14 // human2 = ape1; // 컴파일 에러 15 // human2 = mammal1; // 컴파일 에러

16 // human2 = (Human) mammal1; // 컴파일 OK, 실행 시 에러 17

18 mammal2 = human1; // OK

19 // human2 = mammal2; // 컴파일 에러 20 human2 = (Human) mammal2; // OK

21 // ape2 = (Ape) mammal2; // 컴파일 OK, 실행 시 에러 22 // ape2 = (Ape) animal1; // 컴파일 OK, 실행 시 에러

(63)

Chap.3

4.2.2 static

63

4.2.2 static 메소드 메소드 숨김 숨김

z

static 메소드 숨김

† 부모 클래스에서 정의한 static 메소드를 자식 클래스에서 다시 정의하는 경우

† 부모 클래스의 메소드는 숨겨져서 보이지 않음

† 자식 클래스를 부모 클래스로 타입 변경하면, 부모 클래스의 메소드를 사용할 수 있음

z

예 : MethodHiding.java

1 class Super {

2 static String greeting() { return "Goodnight"; } 3 String name() { return "Richard"; }

4 }

6 class Sub extends Super {

7 static String greeting() { return "Hello"; } 8 String name() { return "Dick"; }

(64)

Chap.3

4.3

64

4.3 인터페이스 인터페이스

z

인터페이스

† 자바에서 서브 타입을 지원하기 위해서 만든 개념

† 모든 메소드가 헤더만 갖고 있고, 바디는 없음

† 형태

† 인터페이스를 구현하는 클래스는 implements 키워드 사용 [ interfacemodifier ] interface name [ extends name ] {

[ interfacefieldmodifier ] type name;

[ interfacemethodmodifier ] returntype name ( argumentlist ) ;

}

(65)

Chap.3

4.3.1

65

4.3.1 인터페이스 인터페이스 기초 기초

z

인터페이스와 추상 클래스

† 추상 클래스는 클래스의 메소드와 멤버 필드의 일부분은 구현, cf) 인터페이스는 전혀 구현되어 있지 않음

† 추상 클래스를 이용하는 경우에는 단일 상속만 지원

cf) 인터페이스는 다중 상속 (multiple inheritance)을 할 수 있음

† 인테페이스를 구현하기 위해서

implements라는 키워드를 사용

implements

인터페이스를 구현하는 것도 서브 타입(subtype)을 만드는 것임

(66)

Chap.3

4.3.1

66

4.3.1 인터페이스 인터페이스 기초 기초

예 )DrawableCircle

(67)

Chap.3

4.3.1

67

4.3.1 인터페이스 인터페이스 기초 기초

z

인터페이스 사용 예

(68)

Chap.3

4.3.1

68

4.3.1 인터페이스 인터페이스 (interface) (interface)

예제 : Drawable.java

1 import java.awt.Graphics;

2

3 interface Drawable {

4 void paint(Graphics g);

5 }

z 예제 : DrawableCircle.java

1 import java.awt.*;

2

3 class DrawableCircle extends Circle implements Drawable { 4 protected int x, y;

……

16 public void paint(Graphics g) { 17 g.drawOval(x-r, y-r, 2*r, 2*r);

18 } 19 }

(69)

Chap.3

4.3.1

69

4.3.1 인터페이스 인터페이스 (interface) (interface)

z 예제 : DrawApplet.java

1 import java.awt.*;

2 import java.applet.*;

3

4 public class DrawApplet extends Applet { 5 Drawable drawable[];

6

7 public void init() {

8 drawable = new Drawable[3];

9 drawable[0] = new DrawableCircle(45, 45, 30);

10 drawable[1] = new DrawableRectangle(25, 25, 40, 65);

11 drawable[2] = new DrawableCircle(90, 70, 60);

12 } 13

14 public void paint(Graphics g) { 15 int n = drawable.length;

16 for(int i=0; i< n; i++) { 17 drawable[i].paint(g);

18 }

………..

(70)

Chap.3

4.3.2

70

4.3.2 인터페이스 인터페이스 특성 특성

z 인터페이스 특성

† 인터페이스의 멤버필드는 디폴드로 static, final로 선언

 따라서 인터페이스의 멤버필드의 값을 변경하려는 시도는 컴파일 시에

에러를 발생

† 인터페이스 구현 – 서브타입

† 여러 개의 인터페이스를 구현하는 경우

 콤마를 이용해서 기술

† 인터페이스의 임플리멘츠도 상속과 같은 개념

 인터페이스를 임플리멘츠한 서브클래스는

인터페이스의 멤버필드를 상속 받아서 사용할 수 있다.

† 인터페이스의 상속

 extends 키워드 사용

interface ScaledDrawable extends Drawable{…..}

(71)

Chap.3

4.4 static

71

4.4 static 과 과 final final 의 의 의미 의미

z final 클래스

† 그 클래스는 더 이상 상속을 통해서 재사용할 수 없음

 final 클래스를 상속받으려는 클래스는 컴파일 시에 에러가 발생

† 클래스 앞에 final 키워드 사용

public final class FinalClass{ …. }final

z final 메소드

† final이 메소드에 선언된 경우, 오버라이딩이 불가능

† 메소드 앞에 final 키워드 사용 public final void print(){ …. }final

z final 멤버필드

† 값을 변경할 수 없는 상수의 의미

† final 멤버필드는 값을 초기화만 할 수 있고, 새로이 값을 할당할 수는 없음

† 멤버필드 앞에 final 키워드 사용 public final int a = 10;final

(72)

Chap.3

4.4 static

72

4.4 static 과 과 final final 의 의 의미 의미

z static 멤버필드

† 객체들간의 전역변수처럼 사용됨

† 클래스 이름으로 접근한다. (ex : Color.red)

† 멤버필드 앞에 static 키워드 사용 static

static int a = 3;

z static 메소드

† 혹은 클래스 메소드라고도 함

† 인스턴스가 아닌 클래스 이름으로 메소드 호출

ex : Math.abs(-10);

† 메소드 앞에 static 키워드 사용

public final staticstatic void sayHello(String arg){ .… }

† 주의

 this, super를 사용할 수 없음

 static이 아닌 멤버필드는 접근할 수 없음

(73)

Chap.3

4.4 static

73

4.4 static 과 과 final final 의 의 의미 의미

z static 초기화

† 클래스내에서 static 키워드를 이용해서 초기화 루틴을 사용할 수 있음

 static 초기화는 클래스가 초기화될 때 수행

 대표적인 static 초기화의 예는 네이티브 메소드에서 라이브러리를 로드 static {

System.loadLibrary("hello");

}

† 자바 클래스에서 멤버필드나 메소드의 위치는 크게 중요하지 않았음

 그러나 static 초기화에서는 변수의 위치는 중요

 뒤에 선언된 변수나 함수를 앞에서 레퍼런스해서 사용할 수 없음

예제 : BadStaticInitial.java

1 class BadStaticInitial { 2 static int i = j + 2;

3 static int j = 4;

4 }

(74)

Chap.3

5.1

74

5.1 내부 내부 클래스 클래스 (Inner Class) (Inner Class)

z

내부 클래스

† 클래스내부에 정의된 클래스

† 외부 클래스의 멤버 필드와 메소드에 자유롭게 접근 가능

z

종류

† 내재된 (Nested) 톱레벨 클래스 / 인터페이스

클래스나 인터페이스가 static으로 선언된 경우

패키지의 멤버 – 다른 클래스에서 사용될 수 있음

† 멤버 클래스

클래스의 멤버로 정의됨

† 지역 클래스

메소드 내부에서 정의됨

† 무명 클래스

메소드 내부에서 정의됨

(75)

Chap.3

5.1.1

75

5.1.1 내재된 내재된 톱레벨클래스 톱레벨클래스 / / 인터페이스 인터페이스

z 내재된 (Nested) 톱레벨 클래스 / 인테페이스

† 다른 클래스에 포함되면서 클래스나 인테페이스가 static으로 선언된 경우

† 다른 톱레벨 클래스와 같이 패키지의 멤버이다.

 LinkedList 클래스에 내재된 인터페이스 Linkable이 있다면,

Linkable 인터페이스는 LinkedList.Linkable로 접근할 수 있다.

예제 : LinkedList.java

1 public class LinkedList {

2 protected Linkable head;

3

4 public LinkedList() { 5 head = null;

6 }

…………...

12 public interface Linkable { 13 public Linkable getNext();

14 } 15 }

(76)

Chap.3

5.1.1

76

5.1.1 내재된 내재된 톱레벨 톱레벨 클래스 클래스 / / 인터페이스 인터페이스

z

예제 : LinkableNode.java

3 public class LinkableNode implements LinkedList.Linkable { 4 protected Object value;

5 protected LinkedList.Linkable next;

...

12 public LinkedList.Linkable next() { 13 return next;

14 } 15

16 public void next(LinkedList.Linkable node) { 17 next = node;

18 }

(77)

Chap.3

5.2

77

5.2 멤버 멤버 클래스 클래스

z 멤버 클래스

† 클래스의 멤버로 Inner 클래스가 선언된 경우이다.

† static으로 선언되지 않는다.

† 자신을 포함하는 클래스의 멤버 필드와 메소드들을 자유롭게 접근

예제 : DrawRecD.java

…..

5 public class DrawRecD extends Applet { 6 int startX, startY, w, h;

………….

21 public class MouseMotionHandler extends MouseMotionAdapter { 22 public void mouseDragged(MouseEvent e) {

23 w = Math.abs(startX - e.getX());

24 h = Math.abs(startY - e.getY());

25 repaint();

26 } 27 }

……….

(78)

Chap.3

5.3

78

5.3 지역 지역 클래스 클래스

z 지역 클래스

† 메소드 내부에 정의된 클래스 : 자바 코드의 블락({… }) 안에서 정의된 Inner 클래스

† 지역 변수의 특성과 유사하다.

† 멤버 클래스는 아니지만, 포함하는 클래스의 멤버 필드와 메소드를 접근

예제 : SomeApplication.java

4 public class SomeApplication extends Frame {……..

5 public static final int EXIT = 0;

…..

23 MenuItem createMenuItem(String label, char shortcut, final int command) { 24 MenuItem item = new MenuItem(label, new MenuShortcut(shortcut));

25

26 class MenuItemHandler implements ActionListener { 27 public void actionPerformed(ActionEvent e) {

28 doCommand(command);

29 } 30 } 31

32 item.addActionListener(new MenuItemHandler());

33 return item;

34 }

………….

(79)

Chap.3

5.3

79

5.3 무명 무명 클래스 클래스

z 무명 클래스

† 지역클래스의 개념을 확장

† 클래스 정의와 사용의 2단계를 1단계로 결합

† 이름을 갖지 않고 한번만 사용

예제 : DrawRecD2.java

…….

8 public void init() {

9 addMouseListener(new MouseAdapter() { 10 public void mousePressed(MouseEvent e) { 11 startX = e.getX();

12 startY = e.getY();

13 } 14

15 public void mouseReleased(MouseEvent e) { 16 w = Math.abs(startX - e.getX());

17 h = Math.abs(startY - e.getY());

18 repaint();

19 } 20 } );

(80)

Chap.3

5.4

80

5.4 자바에서 자바에서 중요한 중요한 클래스 클래스

5.4.1 Object 클래스

† 모든 자바 클래스의 슈퍼 클래스

† “extends Object”를 쓰지 않아도 자동적으로 상속

† Object 클래스들의 메소드

protected Object clone()

z 객체를 복사하는데 사용된다.

public boolean equals(Object obj)

z 두 객체의 내용이 동일한지 알아볼 때 사용되는 메소드

public int hashCode()

z 객체를 위한 해쉬코드를 리턴

z 해쉬코드는 자바 시스템에서 객체를 유일하게 식별하는 정수 값

(81)

Chap.3

5.4

81

5.4 자바에서 자바에서 중요한 중요한 클래스 클래스

데이터 타입 클래스

(82)

Chap.3

5.4

82

5.4 . . 자바에서 자바에서 중요한 중요한 클래스 클래스

z

Boolean 클래스

† Boolean 클래스는 boolean 기본 타입을 표현하기 위한 클래스

† Boolean(boolean value), Boolean(String s) 두 형태의 생성자를 가짐

† 두 번째 생성자의 아규먼트 s는

"true" 문자열과 동일하면 true 값을 갖고, 다른 경우에는 false 값을 갖는다.

† Boolean 클래스로부터 기본 타입 boolean 값을 얻기 위해서는 booleanValue() 메소드를 이용

(83)

Chap.3

5.4

83

5.4 . . 자바에서 자바에서 중요한 중요한 클래스 클래스

z Byte 클래스

† byte 기본 자료 타입을 표현하기 위해 JDK 1.1 이후에 제공되는 클래스

† Byte(byte value), Byte(String s) 두 형태의 생성자를 갖는다

† 두 번째 생성자의 아규먼트는 문자열을 10진수의 바이트값로 변환하면서 문자열의

포맷이 틀린 경우에는 NumberFormatException 예외가 발생

† 메소드

 public static byte parseByte(String s)

z 문자열을 byte 값으로 변환하는 메소드

 public static byte parseByte(String s, int radix)

z 문자열을 radix에 따라 10진수, 2진수 등의 byte 값으로 변환하는 메소드

 public byte byteValue()

z 10 진수 byte 값을 리턴하는 메소드

(84)

Chap.3

5.4

84

5.4 . . 자바에서 자바에서 중요한 중요한 클래스 클래스

z

Character 클래스

† Character(char value) 형태의 생성자를 이용해서 char 기본 타입을 나타내기 위한 클래스로 사용

† 메소드

 public char charValue()

 public static boolean isLowerCase(char ch)

 public static boolean isUpperCase(char ch)

 public static boolean isDigit(char ch)

 public static boolean isLetter(char ch)

 public static boolean isLetterOrDigit(char ch)

 public static char toLowerCase(char ch)

 public static char toUpperCase(char ch)

 public static boolean isWhitespace(char ch)

(85)

Chap.3

5.4

85

5.4 . . 자바에서 자바에서 중요한 중요한 클래스 클래스

z Double 클래스

† Double 클래스는 double 기본 자료형을 클래스로 표현하기 위해 만들어진 클래스로 Double(double value), Double(String s) 두 형태의 생성자

† 멤버필드

public static final double MAX_VALUE - double 형이 갖을 수 있는 최대 값 public static final double MIN_VALUE - double 형이 갖을 수 있는 최소 값 public static final double NaN - double 형에서 숫자가 아님을 표현하기 위해

사용되는 값

public static final double NEGATIVE_INFINITY - double 형의 음의 무한대 값 public static final double POSITIVE_INFINITY - double 형의 양의 무한대 값

† 메소드

public static boolean isNaN(double v) - double 형이 의미 있는 숫자가 아닌지 여부를 알아보는 메소드

public static boolean isInfinite(double v)

public boolean isNaN() - 의미 있는 숫자가 아닌지 여부를 알아보는 메소드

(86)

Chap.3

5.4

86

5.4 . . 자바에서 자바에서 중요한 중요한 클래스 클래스

† Double 클래스의 값을 각 기본 자료형의 값으로 변경하는데 사용되는 메소드

public byte byteValue() public short shortValue()

public int intValue() public long longValue() public float floatValue() public double doubleValue()

(87)

Chap.3

5.4

87

5.4 . . 자바에서 자바에서 중요한 중요한 클래스 클래스

z

Float 클래스

† float 기본 자료형을 클래스로 표현하기 위해 사용되는 클래스

† 생성자

public Float(float value) public Float(double value) public Float(String s)

† 멤버필드

public static final float MAX_VALUE public static final float MIN_VALUE public static final float NaN

public static final float NEGATIVE_INFINITY public static final float POSITIVE_INFINITY

(88)

Chap.3

5.4

88

5.4 . . 자바에서 자바에서 중요한 중요한 클래스 클래스

† 메소드

public static boolean isNaN(float v) public static boolean isInfinite(float v) public boolean isNaN()

† Float 클래스의 값을 각 기본 자료 형의 값으로 변환하는 메소드 public byte byteValue()

public short shortValue() public int intValue() public long longValue() public float floatValue() public double doubleValue()

(89)

Chap.3

5.4

89

5.4 . . 자바에서 자바에서 중요한 중요한 클래스 클래스

z Integer 클래스

† int 기본 자료형을 표현하기 위한 클래스

† Integer 클래스는 Integer(int value), Integer(String s) 두개의 생성자

† 멤버필드

public static final int MAX_VALUE public static final int MIN_VALUE

† 메소드

public static int parseInt(String s) - 문자열을 10진수의 정수로 변환 public static int parseInt(String s, int radix)

- 문자열을 radix로 기술한 진법의 정수로 변환 public byte byteValue()

public short shortValue() public int intValue() public long longValue() public float floatValue() public double doubleValue()

(90)

Chap.3

5.4

90

5.4 . . 자바에서 자바에서 중요한 중요한 클래스 클래스

z Short 클래스

† short 기본 자료형을 표현하기 위한 클래스

† Short 클래스는 Short(short value), Short(String s) 두개의 생성자

† 멤버필드

public static final short MAX_VALUE public static final short MIN_VALUE

† 메소드

public static int parseShort(String s)

public static int parseShort(String s, int radix) public byte byteValue()

public short shortValue() public int intValue() public long longValue() public float floatValue() public double doubleValue()

(91)

Chap.3

5.4

91

5.4 . . 자바에서 자바에서 중요한 중요한 클래스 클래스

z

Math 클래스

† 수학 함수와 이에 필요한 상수들로 구성

† Math 클래스의 모든 메소드들은 static으로 정의되어 있기 때문에 프로그램 내에서 Math 클래스의 인스턴스를 만들지 않고

Math.method_name() 형태로 메소드를 호출해서 사용할 수 있다.

† 멤버필드

public static final double E - 2.7182...

public static final double PI - 3.14159...

(92)

Chap.3

5.4

92

5.4 . . 자바에서 자바에서 중요한 중요한 클래스 클래스

† 멤버필드

public static type abs(type value) - 아규먼트 value 의 절대값을 리턴한다.

public static type max(type a, type b) - a 와 b 중에서 큰 값을 리턴한다.

public static type min(type a, type b) - a 와 b 중에서 작은 값을 리턴한다.

public static double log(double a) - 자연 로그 lna 값을 리턴한다.

public static double pow(double a, double b) - ab 값을 리턴한다.

public static double sin(double a) - sin(a) 값을 리턴한다. a는 라디안 값이다.

public static double sqrt(double a) - a의 제곱근 값을 리턴한다.

public static double random() - 0.0 ~ 1.0 사이의 임의의 값을 리턴한다.

(93)

Chap.3

5.4

93

5.4 . . 자바에서 자바에서 중요한 중요한 클래스 클래스

예제 : MathDemo.java

1 public class MathDemo {

2 public static void main(String args[]) { 3 int a, b;

4 if(args.length == 0) { 5 a = 2;

6 b = 3;

7 } else {

8 a = Integer.parseInt(args[0]);

9 b = Integer.parseInt(args[1]);

10 }

11 System.out.println("pow("+a + ", "+b+") =>" + Math.pow(a,b));

12 } 13 }

z 결과

% java MathDemo 4 5 pow(4, 5) =>1024.0

(94)

Chap.3

5.4

94

5.4 . . 자바에서 자바에서 중요한 중요한 클래스 클래스

z String 클래스

† 문자열을 나타내기 위해 사용

† 생성자

public String()

public String(String value) public String(char[] value)

public String(char[] value, int offset, int count) public String(bytes[] value)

(95)

Chap.3

5.4

95

5.4 . . 자바에서 자바에서 중요한 중요한 클래스 클래스

† 메소드

public char charAt(int index)

public boolean endsWith(String suffix) public int indexOf(char ch)

public int lastIndexOf(char ch) public int length(char ch)

public String replace(char old, char new) public String substring(int beginIndex)

public String substring(int beginIndex, int endIndex) public String toLowerCase()

public String toUpperCase() public String trim()

(96)

Chap.3

5.4

96

5.4 . . 자바에서 자바에서 중요한 중요한 클래스 클래스

예제 : StringDemo.java

1 public class StringDemo {

2 public static void main(String args[]) { 3 String msg = "How are you ?";

4 String greeting = new String(msg);

5

6 if(msg == greeting) {

7 System.out.println("msg == greeting");

8 }else if(msg.equals(greeting)) {

9 System.out.println("msg equals greeting");

10 }

11 System.out.println("original msg: " + msg);

12 msg = msg.replace(' ','');

13 System.out.println("changed msg: " + msg);

14 } 15 }

(97)

Chap.3

5.4

97

5.4 . . 자바에서 자바에서 중요한 중요한 클래스 클래스

z

Vector 클래스

† Vector는 크기가 동적인 배열로 볼 수 있다.

† java.util 패키지에 속해 있다.

† 생성자

public Vector()

- 빈 벡터를 생성한다.

public Vector(int initialCapacity)

- 초기 벡터의 크기를 initialCapacity로 만든다.

public Vector(int initialCapacity, int capacityIncrement) - 초기 벡터의 크기를 initialCapacity로 만들고,

부 족 할 때 마 다 capacityIncrement 만 큼 씩 벡 터 크기가 증가

(98)

Chap.3

5.4

98

5.4 . . 자바에서 자바에서 중요한 중요한 클래스 클래스

† 메소드

public void add(int index, Object element)

- element를 index 위치에 추가 public void addElement(Object element)

- element를 맨끝 위치에 추가 public void remove(int index)

- index 위치의 element를 삭제 public void removeElement(Object element)

- 벡터에서 처음 매칭되는 element를 삭제 public Object elementAt(int index)

- index 번째의 element를 리턴 public int size()

- 현재 벡터에 있는 element의 개수를 리턴

참조

관련 문서

double BuoyancyDisplacementCondition(); // 부력-중량 평형 조건을 계산하는 함수 double CCRequirementCondition(); // 화물창 요구 조건을 계산하는 함수

Sedation, analgesia, and cardiorespiratory function in colonoscopy using midazolam combined with fentanyl or propofol.. A randomized, double-blind, phase 3 study

double BuoyancyDisplacementCondition(); // 부력-중량 평형 조건을 계산하는 함수 double CCRequirementCondition(); // 화물창 요구 조건을 계산하는 함수

- 정부에 의한 독점기업을 민간에 의한 독점기업으로 전환하는 것은 의미가 없음 - 공기업 민영화의 진정한 의미는 소유권 이전이 아니라 경쟁의 도입에 있음

- 원가보상주의의 원칙을 법제화하는 경향을 보이고 있음 - 원가보상주의의 원칙을 법제화하는 경향을 보이고 있음.. 우리나라 공기업의

annualsalary: 외부에서 접근하지 않으나 파생 클래스에서

첫째, 일선 행정기관의 정책조정과 정부혁신을 주도할 중앙관리기관을 정예화 한다. 첫째, 일선 행정기관의 정책조정과 정부혁신을 주도할 중앙관리기관을 정예화

Tenofovir alafenamide versus tenofovir disoproxil fumarate for the treatment of patients with HBeAg-negative chronic hepatitis B virus infection: a randomised, double-blind,