• 검색 결과가 없습니다.

최민 충북대학교 (OCJP )

N/A
N/A
Protected

Academic year: 2022

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

Copied!
35
0
0

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

전체 글

(1)

자바 네트워크 프로그래밍

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

충북대학교

최민

(2)

기본 예제 (has-a 관계 )

비디오샵에서 회원이 비디오테이프를 대여한 경우

이 관계(has a 관계)를 GeneralMember 클래스에 Video 클래스형 멤 버 변수로 표현

public class VideoShop {

public static void main(String[ ] args) {

Video v = new Video( );

v.setVideoData(100, “터미네이터 2”, “아놀드”);

GeneralMember m = new GeneralMember( );

m.setMemberData(1, "허영석", "광진구 능동 123번지", v);

m.printMemberData( );

}

}

(3)

기본 예제

class Video {

private int videoNo;

private String title;

private String actor;

void setVideoData(int vno, String t, String a) { videoNo = vno;

title = t;

actor = a;

} int getVideoNo( ) { return videoNo;

} String getTitle( ) { return title;

} String getActor( ) { return actor;

}

}

(4)

4

기본 예제

class GeneralMember { private int memberNo;

private String name;

private String address;

private Video rentalVideo;

void setMemberData(int mno, String n, String a, Video rv) { memberNo = mno;

name = n;

address = a;

rentalVideo = rv;

} void printMemberData( ) {

System.out.println("회원번호: " + memberNo);

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

System.out.println("주소: " + address);

System.out.println("대여중인 비디오 번호: " + rentalVideo.get VideoNo( ));

System.out.println("대여중인 비디오 제목: " + rentalVideo.get Title( ));

System.out.println("대여중인 비디오 배우: " + rentalVideo.get Actor( ));

}

(5)

예제 설명

has a’ 관계 설명

GeneralMember 클래스와 Video 클래스를 만들어서

GeneralMember 클래스의 멤버 변수로 Video 클래스형 변수 rentalVideo 사용 하였음

‘has a’ 관계 : 클래스간에 물리적인 포함 관계가 있을 때, 또는 클래 스와 클래스에 속해 있는 모든 멤버 변수의 관계

(6)

문제

Which of the following are best expressed as member variable of class Polygon in the statement of

'Polygon is a Drawable, which has a Vector, Color, boolean.'?

□ a) class

□ b) Boolean □ c) Drawable □ d) Color

□ e) Vector

□ f) boolean

(7)

해설 &

[주의]

보기 b) Boolean은 java.lang 패키지에 들어 있는 랩퍼 클래스로, true 또는 false값을 갖는 기본 데이터형 boolean과는 다름

[주의]

보기 e) Vector는 java.util 패키지에 들어 있는 클래스로, 동일 데이 터를 여러 개 관리할 때 활용하는데, 문제 안에 직접 Vector를 포함 해야 한다는 표현이 있는 경우는 물론, “특정 데이터를 여러 개 관리 해야 한다”는 표현이 있을 때도 멤버 변수로 들어가야 함.

(8)

실전 문제

You are going to declare a class and this class is

frequently referred(accessed) by other irrelevant parts.

Polygon is a Shape.

Polygon has a Vector, Color, Boolean.

From the above statements, declare the class Polygon.

( ) ( ) ( ) ( ) ( )

(9)

overloading

오버로딩

서로 다른 메소드가 같은 이름을 갖는 경우

파라미터의 수 or 데이터형(type)을 변화시킴으로서 같은 이름의 메 소드를 여러번 정의할 수 있도록 함.

즉, 오버로딩 된 메소드는 파라미터의 수, 데이터형(type)로 구별

) + 연산자

동일한 + 연산자 이지만, 피연산자의 데이터형(type)에 따라 다른 역할을 수행함

수식에서는 덧셈의 역할

스트링 사이에서 쓰일때는 두 스트링을 연결해주는 역할

(10)

overloading

메소드 오버로딩

여러개의 다른 메소드를 하나의 이름으로 사용하는 것

OCJP 시험에서 오버로딩 판단시 주의사항

리턴형이나 메소드가 던지는 예외의 종류의 차이는 메소드를 구분 하는 특징이 아님

따라서 리턴형 또는 메소드가 던지는 예외의 종류의 차이로 메소드 를 오버로드 할 수 없음을 상기할 것.

1. 메소드가 같은 클래스 혹은 상위 클래스에 존재해야합니다.

2. 메소드의 이름이 같아야 합니다.

3. 메소드의 파라미터 개수가 다르거나, 데이터형이 달라야 합니다.

4. 리턴형은 같아도 되고 달라도 됩니다.

(11)

overloading

메소드 네 개의 이름은 sum으로 통일

정수 두 개나 실수 두 개, 또는 정수 배열이나 실수 배열이 인수로 주어지면 해당 숫자를 더해주는 연산

인수를 받을 파라미터만 적절하게 선언.

오버로드된 메소드의 선언 예

class OverloadTest {

int sum(int i, int i2) { ... }

double sum(double d, double d2) { ... } int sum(int[ ] a) { ... }

double sum(double[ ] a) { ... } }

(12)

overloading

int max(int i, int j){

if ( i >= j ) return i;

else return j;

}

int max(int i, int j, int k){

if ( i >= j ) if ( i >= k ) return i;

else return k;

else return j;

}

max(변수1, 변수2)

max(변수1, 변수2, 변수3)

(13)

기본 예제

메소드 오버로딩의 예

파라미터 개수의 차이로 같은 이름의 메소드를 두 번 선언

class MyOverloading{

void methodA(){

System.out.println("methodA()");

}

void methodA(String s){

System.out.println(s);

}

public static void main(String[] args){

MyOverloading mo = new MyOverloading();

mo.methodA();

mo.methodA("overloaded methodA()");

} }

(14)

예제 설명

출력결과

methodA()

overloaded methodA()

(15)

기본 예제

메소드 오버로딩이 되지 않는 경우.

class MyOverloading{

void methodA(){

System.out.println("methodA()");

}

int methodA(){

int i = 0;

return i;

}

public static void main(String[] args){

MyOverloading mo = new MyOverloading();

mo.methodA();

mo.methodA();

}

}

(16)

문제

Which of the following is a legal return type of a method overloading the following method?

public void add(int a, int b){}

a) void b) int

c) Can be anything

(17)

문제

public class MethodOver { private int x, y;

private float z;

public void setVar(int a, int b, float c) { x=a;

y=b;

z=c;

}

which two overload the setVar method?(choose two) a) void setVar(int a, int b, float c) {

x=a;

y=b;

z=c;

}

(18)

실전 문제

b) public void setVar(int a, float c, int b) { setVar(a, b, c)

}

c) public void setVar(int a, float c, int b) { this(a, b, c)

}

d) public void setVar(int a, float b) { x=a;

y=b;

}

e) public void setVar(int ax, int by, float cz) { x=ax;

y=by;

z=cz;

}

(19)

overriding

오버라이딩

하위 클래스가 상위 클래스에 이미 존재하는 메소드를 재정의

상위 클래스에서 상속받은 메소드를 하위 클래스에서 더 적절히 사 용할 수 있도록 재정의

같은 메소드를 재정의 하는 것이기 때문에 오버라이딩 시 메소드의 이름 및 속성이 완전히 일치

오버라이딩 규칙

상속받은 하위 클래스는 상위 클래스를 구체화시킨 클래스이므로

1. 오버라이드할 메소드가 상위 클래스에 존재 2. 메소드의 이름이 일치

3. 메소드의 파라미터의 개수와 데이터형이 일치 4. 메소드의 리턴형이 일치

5. 상위 메소드와 동일하거나 더 구체적인 Exception을 발생

5. 상위 메소드와 동일하거나 더 범위가 넓은 접근제한자를 사용

(20)

overriding

오버라이드된 메소드의 선언 예

class GeneralMember { // 멤버 변수 선언

void printMemberData( ) { // 데이터 출력

} }

class SpecialMember extends GeneralMember { // 추가된 멤버 변수 선언

void printMemberData( ) {

// 추가된 멤버 변수를 포함하여 데이터 출력 }

}

(21)

overriding

[주의]

상위 클래스에 있는 메소드와 같은 이름으로 파라미터의 숫 자나 데이터형을 다르게 선언하면?

컴파일 시에도 실행 시에도 에러는 발생하지 않습니다.

이때는 오버라이딩 한 것이 아니라 오버로딩한 것입니다.

오버 로딩은 같은 클래스의 메소드들 사이에서도 가능하지만,

클래스가 상속 관계에 있을 때 하위 클래스에서도 가능

(22)

Flow Control

조건 분기문과 반복문을 사용

순차적으로 진행되는 프로그램의 흐름을 프로그래머가 유연하게 제 어

조건 분기문 : 조건식에 따라서 프로그램의 진행방향을 선택할 수 있도록 함

반복문은 : 조건이 만족할 때까지 지정된 블록을 반복해서 실행할 수 있도록 함

흐름제어 문제는 논리연산자와 결합하여 나오기 때문에, 특

short circuit 효과를 비롯한 교재 2장을 복습 필요

(23)

출제 기준

1. if() 문의 조건식은 반드시 논리값 참 또는 거짓값으로 평

2. swich 조건 변수는 반드시 정수값이어야 합니다. 사용 가 능한 데이터 타입, byte, short, char, int 를 기억

3. switch 문에서 break 가 있을 때와 없을 때 문장 수행 과 정을 이해

4. 다중반복문에서 break와 continue 문에 따라 문장의 수

순서가 어떻게 달라지는 이해. 레이블이 있을 때와 없을

때의 적용 범위 이해

(24)

블록 범위

블록 (block)

중괄호 안에 포함된 자바 문장.

크게는 클래스에서부터 작게는 메소드 안에 중첩된 중첩 블록까지, 블록은 자바에서 흐름 제어의 단위임.

흐름 제어

어떤 블록을 수행할 것인지, 또는 몇번이나 수행할 것인지를 결정

if에서 블록 사용 예

if문에 주어지는 boolean값에 따라 if문 뒤에 있는 블록이 수행되느 냐의 여부가 결정.

(25)

블록 범위

public class Test {

public static void main(String[] args) { boolean b = true;

if(b) {

System.out.println("The value is true!");

} } }

(26)

중첩된 블록

중첩 블록

중첩된 블록 앞에 제어문을 사용하여 블록의 실행을 제어하는 경우 가 일반적

하지만, 제어문 없이 중괄호만으로도 중첩된 블록을 구성 가능

public class NestTest {

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

int a;

a = 10;

System.out.println("Value : " + a);

} } }

(27)

중첩된 블록 내에서의 변수 사용

중첩 블록에서의 변수 사용

중첩 블록 내에서 선언된 변수는 해당 블록이 끝나면 소멸.

예) 중첩 블록 뒤에서 a를 액세스하려고 하면 에러 발생

a = 20; 이라는 문장은 a의 scope 바깥에 있으므로 컴파일 에러

public class NestTest {

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

int a;

a = 10;

System.out.println("Value : " + a);

}

a = 20; // scope 밖에서의 변수 사용 }

}

(28)

중첩된 블록 내에서의 변수 사용

중첩된 블록의 바깥에서 이미 선언된 변수는 블록 안에서 다 선언할 수는 없음

C나 C++의 경우 중첩된 블록에서도 변수의 완전한 독립을 보장하지 만, 자바에서는 변수의 선언에 있어서는 그렇지 않습니다.

즉 다음의 예는 컴파일 에러를 발생

public class NestTest {

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

{

int a; // 중복된 변수 선언 a = 10;

System.out.println("Value : " + a);

}

}

}

(29)

중첩된 블록 내에서의 변수 사용

a라는 변수가 이미 main 메소드의 지역변수로 선언되어 있음에도, 중첩된 블록 내에서 다시 a를 선언

중첩된 블록 안에서 같은 이름의 변수 사용을 허가하면 중첩된 블록 밖에 있는 변수를 액세스할 방법이 없기 때문.

(30)

Synchronized 블록

Synchronized

메소드 앞에 붙는 제한자(access modifier) 해당 메소드를 동기화

특정 객체/블럭 대해 lock을 걸 수 있어 동기화 작업을 구체적으로 수행할 수 있고, 또한 필요한 부분만을 동기화 성능의 향상 기대.

public class SynchronizedTest { Object o;

public void method() {

// 동기화가 필요 없는 다른 작업 synchronized(o) {

// o객체와 연관된 동기화가 필요한 작업 }

} }

(31)

Static 블록

static 블록

static 변수에 대해 생각해 보겠습니다. static 변수는 멤버 변수와는 달리 인스턴스를 만들지 않고도 액세스할 수 있는 특별한 변수입니 다.

멤버 변수 : 인스턴스를 만들 때 생성자를 이용하여 초기화

static 변수 : 인스턴스를 만들지 않고 액세스할 수 있어야 하므로 이 러한 방법을 사용할 수 없음

방법 1) static 변수를 선언함과 동시에 초기화

이 방법은 변수의 초기화가 복잡할 경우에는 사용할 수 없음. 이 경 우 static 블록을 사용.

public class StaticTest { public static int a = 10;

}

(32)

Static 블록

static 블록은 클래스에 속하지만 어떤 메소드에도 속하지 않는 블록 으로, 클래스가 로딩될 때 한번만 실행됨

생성자와도 비슷한 이러한 특성을 이용해서 복잡한 static 변수를 초 기화할 수 있음

단, 생성자의 경우 인스턴스를 생성할 때 인자를 사용할 수 있지만 static 블록은 클래스의 로딩과 동시에 실행되므로 인자를 사용할 수 는 없음.

(33)

기본 예제

synchronized 블록을 사용 예

public SyncTest extends Thread { static int a = 0;

public void run() { while(true) {

synchronized(a) {

System.out.print(a + " ");

a++;

} }

} public static void main(String[] args) { SyncTest s1 = new SyncTest();

SyncTest s2 = new SyncTest();

s1.run();

s2.run();

}

(34)

실행 결과

두개의 스레드가 하나의 변수를 출력하고 1을 더하는 과정을 반복 만약, synchronized를 사용하지 않았을 경우에는 출력값은 불규칙 0 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

(35)

기본 예제

static 블록을 사용

import java.util.*;

class StaticClass {

public static String[] str;

static {

str = new String[10];

str[0] = "Hello world!";

str[1] = "Java 2 SCJP";

} public String getString(int i) { return str[i];

} }

public class StaticTest {

public static void main(String[] args) {

System.out.println(StaticClass.getString(0));

System.out.println(StaticClass.getString(1));

} }

참조

관련 문서

Circular_Int_Queue circular_IntQ(MAX_QUEUE_SIZE); // Queue 생성 및 초기화 /*임계구역을 나누어 스레드간의 공유자원 사용을 관리하게 될

청약 당일 인증서 설치 문제로 청약이 곤란할 경우에는 PC를

감리자가 확인한 실행공정률이 예정공정률(주채무자가 감리자에게 제출하는 예정공정표상의

댄스코딩은 간 단하고 쉽게 블록 배열을 통해 춤출 수 있는 아바타를 완성하고, 아바타와 함께 춤추는 과정을 통해 신체활 동의 즐거움을 경험하고 일상생활 속에서

이는 FFR과 SDCA 그리고 HDCA가 각각 자원 d를 사용하기는 하지만, SDCA와 HDCA에서는 간섭제어를 통해 매크로 유저가 사용하는 자원 블록을 제외한 나머지

[r]

구한 변위를 중첩된 강성 매트릭스에 대입하여 미지의 힘과 모멘트를 구함 NAOE/SNU... ① 힘은 압력σ과

여러 나라에 있는 나무의 경우는 나라마 다 부르는 이름이 다를 수가 있고 사용하 는 언어가 다를 경우는 필연적으로 다름... 학명은 속명과 종명을 붙여 부르는데 뒤에 처음으로