자바네트워크프로그래밍 (OCJP 국제공인자격취득중심 ) 충북대학교 최민
기본예제 (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( ); 2
기본예제 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; 3
기본예제 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( )); 4
예제설명 has a 관계설명 GeneralMember 클래스와 Video 클래스를만들어서 GeneralMember 클래스의멤버변수로 Video 클래스형변수 rentalvideo 사용하였음 has a 관계 : 클래스간에물리적인포함관계가있을때, 또는클래스와클래스에속해있는모든멤버변수의관계 5
문제 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 6
해설 & 답 [ 주의 ] 보기 b) Boolean 은 java.lang 패키지에들어있는랩퍼클래스로, true 또는 false 값을갖는기본데이터형 boolean 과는다름 [ 주의 ] 보기 e) Vector 는 java.util 패키지에들어있는클래스로, 동일데이터를여러개관리할때활용하는데, 문제안에직접 Vector 를포함해야한다는표현이있는경우는물론, 특정데이터를여러개관리해야한다 는표현이있을때도멤버변수로들어가야함. 7
실전문제 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. ( ) ( ) ( ) ( ) ( ) 8
overloading 오버로딩 서로다른메소드가같은이름을갖는경우 파라미터의수 or 데이터형 (type) 을변화시킴으로서같은이름의메소드를여러번정의할수있도록함. 즉, 오버로딩된메소드는파라미터의수, 데이터형 (type) 로구별 예 ) + 연산자 동일한 + 연산자이지만, 피연산자의데이터형 (type) 에따라다른역할을수행함 수식에서는덧셈의역할 스트링사이에서쓰일때는두스트링을연결해주는역할 9
overloading 메소드오버로딩 여러개의다른메소드를하나의이름으로사용하는것 1. 메소드가같은클래스혹은상위클래스에존재해야합니다. 2. 메소드의이름이같아야합니다. 3. 메소드의파라미터개수가다르거나, 데이터형이달라야합니다. 4. 리턴형은같아도되고달라도됩니다. OCJP 시험에서오버로딩판단시주의사항 리턴형이나메소드가던지는예외의종류의차이는메소드를구분하는특징이아님따라서리턴형또는메소드가던지는예외의종류의차이로메소드를오버로드할수없음을상기할것. 10
overloading 메소드네개의이름은 sum 으로통일 정수두개나실수두개, 또는정수배열이나실수배열이인수로주어지면해당숫자를더해주는연산 인수를받을파라미터만적절하게선언. 오버로드된메소드의선언예 class OverloadTest { int sum(int i, int i2) {... double sum(double d, double d2) {... int sum(int[ ] a) {... double sum(double[ ] a) {... 11
overloading max( 변수 1, 변수 2) max( 변수 1, 변수 2, 변수 3) 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; 12
기본예제 메소드오버로딩의예 파라미터개수의차이로같은이름의메소드를두번선언 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()"); 13
예제설명 출력결과 methoda() overloaded methoda() 14
기본예제 메소드오버로딩이되지않는경우. 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(); 15
문제 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 16
문제 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; 17
실전문제 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; 18
overriding 오버라이딩 하위클래스가상위클래스에이미존재하는메소드를재정의 상위클래스에서상속받은메소드를하위클래스에서더적절히사용할수있도록재정의 같은메소드를재정의하는것이기때문에오버라이딩시메소드의이름및속성이완전히일치 오버라이딩규칙 상속받은하위클래스는상위클래스를구체화시킨클래스이므로 1. 오버라이드할메소드가상위클래스에존재 2. 메소드의이름이일치 3. 메소드의파라미터의개수와데이터형이일치 4. 메소드의리턴형이일치 5. 상위메소드와동일하거나더구체적인 Exception 을발생 5. 상위메소드와동일하거나더범위가넓은접근제한자를사용 19
overriding class GeneralMember { // 멤버변수선언 void printmemberdata( ) { // 데이터출력 오버라이드된메소드의선언예 class SpecialMember extends GeneralMember { // 추가된멤버변수선언 void printmemberdata( ) { // 추가된멤버변수를포함하여데이터출력 20
overriding [ 주의 ] 상위클래스에있는메소드와같은이름으로파라미터의숫자나데이터형을다르게선언하면? 컴파일시에도실행시에도에러는발생하지않습니다. 이때는오버라이딩한것이아니라오버로딩한것입니다. 오버로딩은같은클래스의메소드들사이에서도가능하지만, 두클래스가상속관계에있을때하위클래스에서도가능 21
Flow Control 조건분기문과반복문을사용 순차적으로진행되는프로그램의흐름을프로그래머가유연하게제어 조건분기문 : 조건식에따라서프로그램의진행방향을선택할수있도록함 반복문은 : 조건이만족할때까지지정된블록을반복해서실행할수있도록함 흐름제어문제는논리연산자와결합하여나오기때문에, 특히 short circuit 효과를비롯한교재 2 장을복습필요 22
출제기준 1. if() 문의조건식은반드시논리값참또는거짓값으로평가 2. swich 조건변수는반드시정수값이어야합니다. 사용가능한데이터타입, byte, short, char, int 를기억 3. switch 문에서 break 가있을때와없을때문장수행과정을이해 4. 다중반복문에서 break 와 continue 문에따라문장의수행순서가어떻게달라지는이해. 레이블이있을때와없을때의적용범위이해 23
블록범위 블록 (block) 중괄호안에포함된자바문장. 크게는클래스에서부터작게는메소드안에중첩된중첩블록까지, 블록은자바에서흐름제어의단위임. 흐름제어 어떤블록을수행할것인지, 또는몇번이나수행할것인지를결정 if 에서블록사용예 if 문에주어지는 boolean 값에따라 if 문뒤에있는블록이수행되느냐의여부가결정. 24
블록범위 public class Test { public static void main(string[] args) { boolean b = true; if(b) { System.out.println("The value is true!"); 25
중첩된블록 중첩블록 중첩된블록앞에제어문을사용하여블록의실행을제어하는경우가일반적 하지만, 제어문없이중괄호만으로도중첩된블록을구성가능 public class NestTest { public static void main(string[] args) { { int a; a = 10; System.out.println("Value : " + a); 26
중첩된블록내에서의변수사용 중첩블록에서의변수사용 중첩블록내에서선언된변수는해당블록이끝나면소멸. 예 ) 중첩블록뒤에서 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 밖에서의변수사용 27
중첩된블록내에서의변수사용 중첩된블록의바깥에서이미선언된변수는블록안에서다시선언할수는없음 C 나 C++ 의경우중첩된블록에서도변수의완전한독립을보장하지만, 자바에서는변수의선언에있어서는그렇지않습니다. 즉다음의예는컴파일에러를발생 public class NestTest { public static void main(string[] args) { int a; { int a; // 중복된변수선언 a = 10; System.out.println("Value : " + a); 28
중첩된블록내에서의변수사용 a 라는변수가이미 main 메소드의지역변수로선언되어있음에도, 중첩된블록내에서다시 a 를선언 중첩된블록안에서같은이름의변수사용을허가하면중첩된블록밖에있는변수를액세스할방법이없기때문. 29
Synchronized 블록 Synchronized 메소드앞에붙는제한자 (access modifier) 해당메소드를동기화 특정객체 / 블럭대해 lock 을걸수있어동기화작업을구체적으로수행할수있고, 또한필요한부분만을동기화성능의향상기대. public class SynchronizedTest { Object o; public void method() { // 동기화가필요없는다른작업 synchronized(o) { // o 객체와연관된동기화가필요한작업 30
Static 블록 static 블록 static 변수에대해생각해보겠습니다. static 변수는멤버변수와는달리인스턴스를만들지않고도액세스할수있는특별한변수입니다. 멤버변수 : 인스턴스를만들때생성자를이용하여초기화 static 변수 : 인스턴스를만들지않고액세스할수있어야하므로이러한방법을사용할수없음 방법 1) static 변수를선언함과동시에초기화 public class StaticTest { public static int a = 10; 이방법은변수의초기화가복잡할경우에는사용할수없음. 이경우 static 블록을사용. 31
Static 블록 static 블록은클래스에속하지만어떤메소드에도속하지않는블록으로, 클래스가로딩될때한번만실행됨 생성자와도비슷한이러한특성을이용해서복잡한 static 변수를초기화할수있음 단, 생성자의경우인스턴스를생성할때인자를사용할수있지만 static 블록은클래스의로딩과동시에실행되므로인자를사용할수는없음. 32
기본예제 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(); 33
실행결과 0 1 2 3 4 5 6 7 8 9 10 11 12 13... 두개의스레드가하나의변수를출력하고 1을더하는과정을반복만약, synchronized를사용하지않았을경우에는출력값은불규칙 34
기본예제 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)); 35