• 검색 결과가 없습니다.

최민 충북대학교 (OCJP )

N/A
N/A
Protected

Academic year: 2022

Share "최민 충북대학교 (OCJP )"

Copied!
45
0
0

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

전체 글

(1)

자바 네트워크 프로그래밍

(OCJP 국제공인자격 취득 중심 )

충북대학교

최민

(2)

Converting and casting rules

데이터의 형변환이 발생하는 경우를 설명 암묵적 형변환(implicit type casting) 명시적 형변환(explicit type casting)

기본 데이터형과 오브젝트 데이터형의 형변환

(3)

출제기준

1. 기본자료형 사이에서의 묵시적 형변환 방향 학습 2. 객체 참조 변환에서의 묵시적 형변환 방향 학습 3. 명시적 형변환이 필요한 경우와 그 결과를 예측 4. casting과 conversion의 차이점을 이해

5. widening numeric conversion과 narrowing

numeric conversion의 뜻 이해

(4)

implicit 형변환과 explicit 형 변환

형변환 (type casting, type conversion)은

서로 다른 타입의 변수 사이에 연산이 있을 때 발생

묵시적(implicit) : 프로그래머가 신경 쓰지 않아도 자동적으로 처리 되는 경우

명시적(explicit) : 표현식 앞에 별도로 코딩이 필요한 경우

형변환이 발생하는 근본적인 이유

형(type)이 다른 변수들은 표현범위가 서로 다르기 때문

의도하지 않은 값의 손실을 막기 위해서 표현범위가 더 좁은쪽으로 의 형변환이 필요할 때는 반드시 명시적으로 형변환을 해야 함.

(5)

implicit 형변환과 explicit 형 변환

묵시적인 형변환이 자동적으로 처리되는 이유

자바가 허용하는 안전한 방향으로 형변환이 이루어져서 연산시에 자료값의 손실이 발생하지 않기 때문

명시적 형변환 방법의 예

class ExplicitCastEx {

public static void main(String[] args) {

int i;

float f = 1.7f;

i = (int) f; //명시적으로 형변환하는 모습 System.out.println(i);

}

(6)

implicit 형변환과 explicit 형 변환

연산결과 : 정수값 1

원래의 실수값 1.7로부터 0.7 이라는 소수 부분이 유실되었 지만 , 컴파일 에러는 발생하지 않음

명시적 형변환 : 형변환이 필요한 데이터형 앞에 괄호를 쓰고

안에 목적 데이터 형을 기술함.

(7)

기본 예제

묵시적인 형변환의 예

정수로 선언된 i에 char 로 선언된 c를 대입.

변수는 서로 데이터형이 다르기 때문에 형변환 필요

class MyImplicit {

public static void main(String[]args) { int i;

char c = 'A';

i = c;

System.out.println("ASCII value of A = " + i);

} }

(8)

예제 설명

자바가상기계에서 자동적으로 형변환을 해주어서 명시적인 코딩이 필요없는 경우를 묵시적인 형변환에 해당

ASCII value of A = 65

(9)

기본 예제

명시적인 형변환이 필요한 예.

컴파일 에러 발생함!!!

class MyExplicit {

public static void main(String[]args) { int i = 0;

float f = 1.78f;

i = f + i; //point x

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

} }

(10)

예제 설명

//point x 부분 때문

실수 부분이 손실 될 수 있다는 메세지 출력.

//point x 부분을 아래와 같이 수정

MyImplicit.java:5: possible loss of precision

i = (int) f + i;

(11)

예제 설명

float 값을 강제로 정수값으로 형변환 시므로

0.78이라는 소수값이 소실되는 것은 변함 없음.

하지만, 프로그래머가 그러한 사실을 인지하고 있음이 인지되므로, 프로그램의 신뢰도를 높일 수 있음

출력결과 .

i = 1

(12)

primitive 데이터형과 형변환

기본 자료형

데이터 타입별로 메모리상에 할당받는 값과 표현가능한 범위, 표현 방식 다름

서로 다른 데이터형을 가지는 변수끼리 연산을 하면 형변환이 필요.

아래 테이블은 자바의 기본 자료형을 이해하는데도 도움 됨

boolean, byte, char, short, int, long, float, double

기본 데이터형의 경우, 연산자 오른쪽에 있는 식을 평가한 데이터의 형이 연산자 왼쪽에 있는 변수의 형과 같은 경우에 대입하는것 원칙 다음 조건을 만족시킬 경우 양변의 데이터형이 달라도 대입가능

(13)

primitive 데이터형과 형변환

구 분

(기본 데이터형) 대입 가능 여부 사용 예

▶ 좌변 변수의 데이터형과 우변

식의 데이터형이 같을 때 대입 가능 int x = 10;

int y = x;

▶ 좌변 변수의 데이터형이 우변 식의 데이터형보다 유효 범위가 클 때(예 : long ← int)

대입 가능

(자동 promotion)

int x = 10;

long y = x;

▶ 좌변 변수의 데이터형이 우변 식의 데이터형보다 유효 범위가 작을 때(예 : short ← int)

형 변환(캐스트) 연산 자를 이용하여 변환 후 대입(demotion)

int x = 10;

short y = (short)x;

(14)

primitive 데이터형과 형변환

float 와 double : 형변환의 마지막 단계에 위치하는 것 주

화살표의 정방향으로 형변환이 이루어질 때는 묵시적으로 형

변환이 됨.

(15)

primitive 데이터형과 형변환

[주의]

char형에서 short형으로 변환하는 경우나, short형에서 char형으로 변환하는 경우 모두 형 변환 연산이 필요합니다.

[주의]

double형에서 float형으로 변환하는 경우는 항상 유효 숫자가 손실 되는 것이므로 반드시 형 변환 연산을 하거나, 우변 숫자 뒤에 f를 붙여 double형 리터럴이 아닌 flaot형 리터럴임을 표시해야 합니다.

[주의]

boolean 형과 byte, char, short, int, long, float, double형 등 숫자 계열은 형 변환 연산자를 사용하더라도 서로 변환되지 않습니다.

(16)

primitive 데이터형과 형변환

명시적 형변환이 요구되는 상황에서 현변환 연산을 하지 않 으면 값이 손실될 수 있다는 다음과 같은 컴파일 에러가 발생

형변환 규칙

묵시적인 경우 프로그래밍 편의성을 제공

명시적인 경우 값의 손실을 프로그래머가 예측한 경우에만 허용함

프로그램의 안정성을 보장.

possible loss of precision

(17)

기본 예제

primitive 데이터 형의 묵시적 형변환의 예

class TestImplicit

{ public static void main(String[] args) {

byte b = 123;

short s = 321;

char c = 'A';

int i;

long l;

float f = 0.456f;

i = b + s;

l = i + c;

f += b;

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

System.out.println("l = " + l);

System.out.println("f = " + f);

}

(18)

예제 설명

예제 파일에 나오는 변수들은 모두 데이터 형이 다름

다른 데이터형을 가진 변수들의 연산이 일어나고 있지만, 명 시적인 형변환 코드는 없음.

모두 묵시적으로 형변환 됨.

이 예제에서 이루어지는 연산들이 모두 값을 손실하지 않도록 표현 범위가 더 넓은 자료형을 향해서 이루어지고 있기 때문

) byte 형의 b와 short 형의 s 는 자신들보다 표현범위가

넓은 i(integer 타입)에 할당.

(19)

예제 설명

위의 프로그램을 출력한 결과는 다음과 같습니다.

i = 444 l = 509

f = 123.456

(20)

기본 예제

primitive 데이터 형의 명시적 형변환의 예.

class TestExplicit

{ public static void main(String[] args) {

byte b = 100;

short s;

char c = 'A';

int i;

float f = 0.456f;

i = (int) f + b;

s = (short) (i + c);

(21)

예제 설명

위의 예제의 출력 결과는 다음과 같습니다.

i에는 b의 값 100 과 f 값 0.456 을 더한 값이 할당되게 되어 있지만, 소 수값이 표현되지 않고 정수부분만 표현(일부 손실)

(int) 명시적 형변환 구문이 포함되어 있지 않았다면, 값이 손실될 것이 라는 컴파일러 에러가 발생

프로그래머는 그것을 감수하겠다는 의미로 형변환 연산자를 사용해서, float 형의 결과 100.456을 int 형 변수 i 에 대입하기 위해서 강제적으 int 형으로 변환

과정에서 int 형으로 표현할 수 없는 소수 값이 사라짐

i = 100 s = 165

(22)

객체 참조 변환

오브젝트 형(객체 타입)의 경우에도 서로 다른 객체의 참조 끼리의 연산이 발생하면 당연히 형변환이 발생

묵시적 (implicit)인 경우와 명시적(explicit)인 경우로 나누

생각할 수 있습니다.

(23)

객체 참조 변환

앞에서 형변환이 발생했을 때 값의 손실이 발생하지 않으면 자바가상기계가 자동적으로 형변환을 해준다고 배웠습니다.

객체 참조의 경우

묵시적인 형변환 : 상위 객체의 참조에 하위 객체의 참조를 대입

, 상속 관계에 있는 오브젝트 데이터형의 경우, 다음 표와 같은 조건을 만족시키면 묵시적인 형변환이 이루어져 문제없 객체를 참조 변수에 대입할 수 있음

상속 관계가 없는 오브젝트 데이터형의 경우에는 어떤 방법으로도 대입할 수 없음

(24)

객체 참조 변환

구 분

(오브젝트 데이터형 : 클래스)

대입 가능 여부 사용 예

▶ 우변 식의 클래스와 좌변

변수의 클래스가 같을 때 대입 가능 String s = "abc";

String s2 = s;

▶ 우변 식의 클래스가 좌변 변수의 클래스의 하위 클래스 일 때

(예 : Object ← String)

대입 가능 String s = "abc";

Object o = s;

▶ 우변 식의 클래스가 좌변 변수의 클래스의 상위 클래스

형 변환 연산자를 이용하여 변환 후 대입

String s = "abc";

Object o = s;

(25)

객체 참조 변환

객체 참조 변환

객체참조 변수에 직접 다른 객체의 참조값을 대입할 때 발생

a와 b는 서로 다른 객체이기 때문에 대입 연산을 하기 위해서는 형 변환을 반드시 거쳐야 함

만약 A가 상위(Super) 클래스이고 B가 A의 하위(Sub) 클래스라면 위 의 구문은 에러 없이 컴파일 가능

형변환 연산을 명시적으로 표시하지 않은 것으로 보아 묵시적 형변

A a = new A();

B b = new B();

a = b;

(26)

객체 참조 변환

하지만 , A와 B과 서로 무관한 클래스인 경우

세번째 문장은 타입이 맞지 않는다는 컴파일 에러 발생

a = (A) b; 명시적으로 형변환 연산시에는 컴파일 에러 나타 나지 않음.

실행시 문제가 발생할 소지는 여전히 존재함.

incompatible types

(27)

객체 참조 변환

객체 참조 변환

참조값의 직접 대입 외에도 객체 생성을 통한 대입을 통해서도 가능

객체 메소드 호출 변환

A 타입으로 선언된 참조변수 a에 B() 타입 객체를 대입

이 장에서 변환 형식의 이름은 중요하지 않습니다. 구분할 수 있으 면 됩니다.

만약 B가 A의 하위 클래스라면

위의 문장은 에러 없이 컴파일

두 클래스가 서로 무관하다면

A a = new B();

(28)

객체 참조 변환

[주의]

Implicit = upcast = safe = automatic

묵시적 형변환은 상위 방향(범위가 넓은 쪽, 상위 객체인 쪽)으로 이루

어지며,

값의 손실이 없어 안전하고,

별도의 코딩이 없이 자동적

Explicit = downcast = unsafe

명시적 형변환은 하위 방향(범위가 좁은 쪽, 하위 객체인 쪽)으로 이루

어지며,

값의 손실이 있어 안전하지 못하고

캐스트 연산자로 명시적으로 형변환

(29)

기본 예제

하위 객체를 상위 객체에 대입할 때

묵시적으로 형변환 되는 상황

class MyObject {

public static void main(String[] args) {

Object o = new Object();

MyObject mo = new MyObject();

o = mo;

System.out.println(mo.equals(o));

}

(30)

예제 설명

암묵적 형변환

서로 다른 객체의 참조 o 와 mo 사이에서 대입연산 : 묵시적형변환 이 코드는 컴파일 에러도 일으키지 않음

실행결과 : true 값을 출력

(31)

기본 예제

하위 객체에 상위 객체를 대입

컴파일 에러가 발생

명시적으로 형변환한 결과를 확인.

class MyObject2 {

public static void main(String[] args) {

MyObject2 mo = new MyObject2();

Object o = new Object();

mo = o;

System.out.println(mo.equals(o));

}

(32)

예제 설명

실행결과 : 컴파일 에러 발생

하위 객체의 참조에 상위 객체의 참조를 대입하려고 했기 때 문입니다 . 이때 아래와 같이 명시적으로 형변환을 해주면 컴 파일 에러는 없어집니다.

MyObject2.java:7: incompatible types found : java.lang.Object

required: MyObject2 mo = o;

^

(33)

예제 설명

하지만 이번에는 런타임 에러가 발생합니다.

[주의]

기본자료형의 형변환에서는 : 명시적인 형변환을 함으로서 값의 손 상을 감수한 상태로 프로그램을 진행가능하나,

객체 참조 사이의 형변환에서는 : 명시적으로 형변환 해주어도 런타 임시에 예외가 발생하는 것을 기억

java.lang.ClassCastException: java.lang.Object at MyObject2.main(MyObject2.java:7)

(34)

예외처리 (exception handling)

예외 (Exception)처리

프로그램을 더 견고하고, 안전하게 해주는 자바언어의 특징 예외란, 프로그래머가 사전에 예측할 수 있는 가벼운 에러

예외의 발생, 발생한 예외를 처리하는 방법, 예외의 발생에 따른 프 로그램의 흐름을 이해하여야 함.

(35)

출제 기준

1. 예외를 던지는 메소드를 선언하는 방법

2. 예외를 적절히 이용하는 코드 및 예외 처리 구문인 try, catch, finally를 사용하는 코드를 작성

3. 예외를 발생시키는(throw) 일반 메소드 및 오버라이드된 메소드를 선언할 수 있어야 합니다.

4. 예외가 발생했을 때와 그렇지 않을 때 try, catch, finally 문의 실행 순서

4. finally{} 블록은 시스템이 정상 종료하는 한 반드시 실행 된다는 사실

5. 상위 예외 클래스는 하위 예외 객체를 잡을 수 있음

(36)

Exception 클래스

예외

프로그램이 정상적으로 진행되지 못하게 하는 돌발 상황을 말합니 다.

예) 사용자에게 인풋을 받아 수식을 계산하는데, 사용자가 제수로 0 를 입력

예) 파일을 열려고 하는데, 열려고 하는 디렉토리에 해당 파일이 존 재하지 않을 경우에도 예외가 발생하겠지요.

예외처리를 하지 않으면 위와 같은 예외 상황이 발생했을 때

프로그램은 종료됨

(37)

Exception 클래스

예외처리

예외가 발생하더라도 가능하면 프로그램을 계속 진행하도록 하고, 사용자에게 예외가 발생한 이유를 설명하고,

다시 시도하도록 할 수도 있음

자바에서는 예외(Exception)도 객체임

따라서 형과 메소드, 데이터를 가짐

자바에서 처리하는 예외는 모두 Exception 클래스에서 파 Exception 클래스는 Throwable 클래스의 하위 클래스임 결국 모든 예외 클래스가 Throwable의 하위 클래스임

(38)

Exception 클래스

(39)

Exception 클래스

Error 와 RuntimeException 은 심각한 에러로 인해 프로 그램을 더 이상 진행시킬 수 없을 때

즉, 프로그램 진행상의 치명적인 문제로 프로그래머가 이를 처리할 수 없습니다. 따라서 이 장에서 다루는 예외 처리와는 무관

자바 예외 처리는 미리 정의된 가벼운 예외에 한해서 가능

예외가 발생할 수 있는 상황들을 미리 정의해놓고, 정의해 놓은 상 황들을 검색해서 해당하는 예외가 발생했을 때 적절한 조치를 취하 거나, 사용자에게 발생했다는 사실을 알리고 프로그램을 진행시킬 수 있음

(40)

Exception 클래스

CheckedException

미리 정의된 가벼운 예외

이런 클래스가 존재하는 것이 아니라, 정의된 클래스 전체를 지칭하 는 말입니다.

프로그래머가 Exception 클래스를 상속 받아 정의하는 사용자 정의 예외 클래스들도 CheckedException의 하나임

(41)

Exception 클래스

[주의]

자바의 예외처리가 다른 언어들과 비교해서 좋은 점은, 구문의 간결 함과 미리 정의된 API의 다양함에 있음

자바와 같은 구조를 사용하지 않는 언어의 경우 간단한 파일 입출력 문장에 예외처리 구조를 덧붙이면 10라인으로 코딩할 수 있는 내용 이 30-40라인에 이르게 됨

이렇게 되면 해당 코드가 파일 입출력 구문이라는 사실 조차 파악하 기 힘들어짐

(42)

기본 예제

멤버 변수와 메소드를 가지는 예외(Exception) 클래스 정의

class MyException extends Exception { String name = "MyException";

void printInfo(String msg) {

System.out.println(name + " : ");

System.out.println(msg);

} }

(43)

예제 설명

예외 클래스는 모두 Exception 클래스를 상속

정의된 Exception 클래스는 name 이라는 멤버변수를 가지고 자신의 이름과 호출된 곳에서 보내는 String 변수를 출력하는 printInfo() 메 소드를 가지고 있음

이처럼 , 자바에서는 예외가 발생시

발생한 예외 객체의 멤버변수나 메소드를 이용해서 예외의 속성을 알리거나, 예외가 발생한 원인을 규명할 수 있음

(44)

기본 예제

앞의 사용자 정의 예외 클래스를 확장하면,

class MyException extends Exception { String name = "MyException";

void printInfo(String msg) {

System.out.println(name + " : ");

System.out.println(msg);

}

} // 여기까지는 앞장의 code

class MyExceptionSub extends MyException { String name = "MyExceptionSub";

void printUse() {

(45)

예제 설명

예외 클래스는 다른 예외 클래스를 상속할 수 있음을 보이는 예제입니다 .

예외를 처리하고, 발생하는 방법에 대해서는 다음 슬라이드

에서 다룸

참조

관련 문서

• 모든 자바 입출력 클래스는 궁극적으로 바이트단위 입출력 을

Nordstrom의 구조는 경영자들이 하위 계층의 종업원들에게 권한을 위양하고 그들을 지원하는 것이 중요하게 인식하는 조직문화를

검색창 하위 항목에서 검색어가 포함된 주제 및 콘텐츠 타이틀 확인 자료 유형별 아이콘:.. 검색 결과 원하는 자료 유형을 선택하여

8.4.1 Two-phase equilibrium between the liquid and a solid solution (iii) Extension of tie line cannot intersect the vertex of triangle6. Exception : solubility

본 연구는 무용전공 학생들의 일반적인 특성에 따른 임파워링 리더십의 하위 요인과 무용자신감 학교생활적응의 차이를 규명하고 무용지도자의 임파워링 리

우리나라도 예외는 아니었습니다... 우리나라도

열매는 열개되는 삭과 또는 골돌, 탁엽이 없다.. 자방은 하위, 열매는 이과

protected void setUp() throws Exception{.