Class : Method Jo, Heeseung
목차 section 1 생성자 (Constructor) section 2 생성자오버로딩 (Overloading) section 3 예약어 this section 4 메소드 4-1 접근한정자 4-2 클래스메소드 4-3 final, abstract, synchronized 메소드 4-4 메소드반환값 (return value) section 5 메소드오버로딩 (Overloading) section 6 메소드에값전달 (Argument passing) 방법 2
클래스의일반구조 클래스의구성 멤버변수 : 속성 생성자 : 클래스가객체화될때수행되는메소드 메소드 : 기능 3
생성자 (Constructor) 생성자 클래스로부터객체가생성될때객체의초기화과정을기술하는특수한메소드 객체가생성될때무조건수행 객체가생성될때한번만수행 return 값지정하지않음 형식 [public/private] 클래스이름 ( 매개변수 ){... 초기화문장들... 4
생성자 (Constructor) 생성자 class Box { private int width; private int height; private int depth; private int vol; public Box(int w, int h, int d) { width = w; height = h; depth = d; class BoxTest {... Box mybox1 = new Box(10,20,30); Box mybox2 = new Box();... 오류발생, 적합한생성자가없다. 5
생성자 (Constructor) 실습예제 Box5Test.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 class Box5 { int width; int height; int depth; public Box5(int w, int h, int d) { width = w; height = h; depth = d; public class Box5Test { public static void main(string args[]) { Box5 mybox1 = new Box5(10,20,30); int vol = mybox1.width * mybox1.height * mybox1.depth; System.out.println(" 박스의부피 : " + vol); 생성자로서초기화과정수행 3 개의매개변수로객체생성 6
생성자 (Constructor) 7
생성자오버로딩 (Overloading) 같은이름의생성자를여러개중첩 (overloading) 하여사용 class Box5 { int width; int height; int depth; public Box5() { width = 1; height = 1; depth = 1; public Box5(int w) { width = w; height = 1; depth = 1; public Box5(int w, int h) { width = w; height = h; depth = 1; 8
생성자오버로딩 (Overloading) public Box5(int w, int h, int d) { width = w; height = h; depth = d; public class Box5Test {... Box5 mybox1 = new Box5(); Box5 mybox2 = new Box5(10); Box5 mybox3 = new Box5(10,20); Box5 mybox4 = new Box5(10,20,30);... 매개변수의개수와형식에따라적합한생성자수행 9
생성자오버로딩 (Overloading) 실습예제 Box6Test.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 class Box6 { int width; int height; int depth; double dwidth; double dheight; double ddepth; public Box6(int w, int h, int d) { width = w; height = h; depth = d; public Box6(double w, double h, double d) { dwidth = w; dheight = h; ddepth = d; 두개의생성자를오버로딩 두개의생성자를오버로딩 10
생성자오버로딩 (Overloading) 실습예제 Box6Test.java 21 22 23 24 25 26 27 28 29 30 31 32 33 34 public class Box6Test { public static void main(string args[]) { Box6 mybox1 = new Box6(10,20,30); Box6 mybox2 = new Box6(10.5,20.5,30.5); Box6 mybox3 = new Box6(10.5,20.5,30); int vol1 = mybox1.width * mybox1.height * mybox1.depth; 생성자의매개변수에적합한생성자수행 double vol2 = mybox2.dwidth * mybox2.dheight * mybox2.ddepth; double vol3 = mybox3.dwidth * mybox3.dheight * mybox3.ddepth; System.out.println (" 정수박스의부피 : " + vol1); System.out.println (" 실수박스의부피 : " + vol2); System.out.println (" 정수와실수가섞여있는박스의부피 : " + vol3); 11
생성자오버로딩 (Overloading) 12
예약어 this this 자바의예약어 (reserved word) 현재의객체를의미 class Box { int width; int height; int depth; public Box(int width, int height, int depth) { width=width; height=height; depth=depth; 13
예약어 this this class Box { int width; int height; int depth; public Box(int width, int height, int depth) { this.width=width; this.height=height; this.depth=depth; 이객체변수를의미 14
예약어 this class Box5 { int width; int height; int depth; public Box5() { this(1,1,1); public Box5(int w) { this(w,1,1); public Box5(int w, int h) { this(w,h,1); public Box5(int w, int h, int d) { width = w; height = h; depth = d; 같은클래스내의다른생성자호출 public class Box5Test {... Box5 mybox1 = new Box5(); Box5 mybox2 = new Box5(10); Box5 mybox3 = new Box5(10,20); Box5 mybox4 = new Box5(10,20,30);... 15
메소드 메소드 객체가할수있는행동을정의 형식 [ 접근한정자 ] [static/final/abstract/synchronized] 반환값타입메소드이름 ([ 매개변수들 ]) {... 지역변수선언및메소드행위기술... static : 클래스메소드 final : 종단메소드 abstract : 추상메소드 synchronized : 스레드의동기화를위한메소드 16
접근한정자 메소드선언시사용되는접근한정자 멤버변수접근한정자와같이 public, private 가사용 public class Test1 { public int a; int b; private int c; public void method1() { void method2() { private void method3() { public 멤버변수선언접근한정자를지정하지않고선언 private 멤버변수선언 public 메소드선언접근한정자를지정하지않음 private 메소드선언 17
접근한정자 같은패키지에속해있는클래스에서사용하는예 public class SamePackage { Test1 t1 = new Test1(); t1.a = 3; t1.b = 5; t1.c = 7; t1.method1(); t1.method2(); t1.method3(); 접근가능접근가능접근불가능접근가능접근가능접근불가능 public class Test1 { public int a; int b; private int c; public void method1() { void method2() { private void method3() { 18
접근한정자 다른패키지에속해있는클래스에서사용하는예 public class OtherPackage { Test1 t2 = new Test1(); t2.a = 3; t2.b = 5; t2.c = 7; t2.method1(); t2.method2(); t2.method3(); 접근가능접근불가능접근불가능접근가능접근불가능접근불가능 public class Test1 { public int a; int b; private int c; public void method1() { void method2() { private void method3() { 19
접근한정자 실습예제 Box8Test.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 class Box8 { private int width; private int height; private int depth; private int vol; public Box8(int w, int h, int d) { width = w; height = h; depth = d; volume(); private void volume() { vol = width * height * depth; private 접근한정자로객체변수선언 부피를구하는메소드를 private 로선언 20
접근한정자 실습예제 Box8Test.java 17 18 19 20 21 22 23 24 25 26 27 28 29 30 public int getvolume() { return vol; public class Box8Test { public static void main(string args[]) { Box8 mybox1 = new Box8(10,20,30); // mybox1.width = 20; // mybox1.volume(); System.out.println 부피의값을읽어오는메소드만 public 으로선언 (" 정수박스의부피 : " + mybox1.getvolume()); private 로선언된변수에접근하면오류발생 private 로선언된메소드에접근하면오류발생 21
접근한정자 22
클래스메소드 클래스메소드 클래스변수와비슷한특징을가짐 class Box { int width; int height; int depth; long idnum; static long boxid = 100; static long getcurrentid() { depth++; return boxid++; 클래스메소드는클래스변수만사용. depth 는객체변수이므로오류발생 23
클래스메소드 실습예제 Box9Test.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 class Box9 { private int width; private int height; private int depth; public long idnum; static long boxid = 100; static long getcurrentid() { int count = 1; boxid = boxid + count; return boxid; public class Box9Test { public static void main(string args[]) { Box9 mybox1 = new Box9(); 클래스변수선언 클래스메소드선언 ( 지역변수사용가능 ) 24
클래스메소드 실습예제 Box9Test.java 17 18 19 20 21 22 23 24 25 26 27 28 mybox1.idnum = Box9.getCurrentID(); Box9 mybox2 = new Box9(); mybox2.idnum = Box9.getCurrentID(); System.out.println ("mybox1의 id 번호 : "+ mybox1.idnum); System.out.println ("mybox2의 id 번호 : "+ mybox2.idnum); System.out.println (" 다음박스의번호는 "+ Box9.getCurrentID() + " 번입니다 "); 클래스메소드호출 ( 클래스이름사용 ) 클래스메소드호출 ( 클래스이름사용 ) 클래스메소드호출 ( 클래스이름사용 ) 25
클래스메소드 26
final, abstract, synchronized 메소드 final 로선언된메소드 서브클래스에서오버라이딩 (overriding) 될수없음 abstract 로선언된메소드 추상메소드로써추상클래스내에서선언 추상메소드는선언부분만가지고몸체부분은가질수없음 몸체부분은서브클래스에서오버라이딩해야함 synchronized 메소드 스레드를동기화할수있는기법을제공하기위해사용 28
메소드반환값 (return value) 메소드선언부에는그메소드반환값의자료형이지정되어야함 반드시지정된형과같은값을 return 문을사용하여반환 반환값이없을경우에는 void 로지정 29
메소드반환값 (return value) public int sum(int a, int b) { int c; c = a + b; return c; // 정수값을반환 public Box volume_compute(box instance_box) {... Box v_box = new Box(); v_box.width = instance_box.width; v_box.height = instance_box.height; v_box.depth = instance_box.depth; v_box.volume= v_box.width * v_box.height * v_box.depth; return v_box; // Box 객체를반환 30
메소드오버로딩 (Overloading) 메소드오버로딩 객체지향언어의특징중에하나인다형성 (polymorphism) 을제공 하나의메소드이름으로다양한연산을수행할수있는방법을제공 중첩된메소드가호출되면매개변수의형과개수를비교하여적합한메소드가실행 31
메소드오버로딩 (Overloading) 실습예제 Box10Test.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 class Box10 { private int i_volume; private double d_volume; public Box10(int w, int h, int d) { volume(w, h, d); public Box10(double w, double h, double d) { volume(w, h, d); private void volume(int w, int h, int d) { i_volume = w * h * d; private void volume(double w, double h, double d) { d_volume = w * h * d; 데이터형에적합한메소드실행 데이터형에적합한메소드실행 같은이름의메소드오버로딩선언 32
메소드오버로딩 (Overloading) Box10Test.java 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 public int get_i_volume() { return i_volume; public double get_d_volume() { return d_volume; public class Box10Test { public static void main(string args[]) { Box10 mybox1 = new Box10(10,20,30); Box10 mybox2 = new Box10(10.5,20.5,30.5); Box10 mybox3 = new Box10(10.5,20.5,30); System.out.println (" 정수박스의부피 : " + mybox1.get_i_volume()); System.out.println (" 실수박스의부피 : " + mybox2.get_d_volume()); System.out.println (" 정수와실수가섞여있는박스의부피 : " + mybox3.get_d_volume()); 33
메소드오버로딩 (Overloading) 34
메소드오버로딩 (Overloading) 실습예제 OverloadTest.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 class Overload{ void calc(){ System.out.println(" 매개변수가없습니다."); void calc(int width){ System.out.println(" 정사각형의넓이 : " + width * width); void calc(int width, int height){ System.out.println(" 직사각형의넓이 : " + width * height); void calc(int width, int height, int depth){ System.out.println(" 직육면체의부피 : " + width * height * depth); public class OverloadTest { 메소드를오버로딩으로선언 메소드를오버로딩으로선언 메소드를오버로딩으로선언 메소드를오버로딩으로선언 35
메소드오버로딩 (Overloading) OverloadTest.java 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 public static void main(string args[]){ Overload ol = new Overload(); int input[] = new int[args.length]; for(int i=0; i<args.length; i++) input[i] = Integer.parseInt(args[i]); switch (args.length){ case 0: ol.calc(); break; case 1: ol.calc(input[0]); break; case 2: ol.calc(input[0], input[1]); break; case 3: ol.calc(input[0], input[1], input[2]); break; default: System.out.println(" 인수의개수가많습니다."); 오버로딩메소드호출 오버로딩메소드호출 오버로딩메소드호출 오버로딩메소드호출 36
메소드오버로딩 (Overloading) 37
메소드에값전달 (Argument passing) 방법 실매개변수와형식매개변수로기본자료형이사용되는경우 39
메소드에값전달 (Argument passing) 방법 매개변수와형식매개변수로참조자료형이사용되는경우 40
메소드에값전달 (Argument passing) 방법 실습예제 ArgumentTest1.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 class Argument { public void change(int i, int j[], StringBuffer sb) { i = 20; j[3] = 400; sb.append(" 화이팅자바."); public void display(int i, int j[], StringBuffer sb) { System.out.println(" 객체변수 i 의값 : " + i); System.out.print(" 배열의값 : "); for(int index = 0; index < j.length; index++) System.out.print(j[index] + " "); System.out.println(""); 기본자료형의값을변환 System.out.println(" 문자열 sb 의값 : " + sb); 배열 ( 참조자료형 ) 의요소를변환 문자열 ( 참조자료형 ) 뒤에문자열을첨가 매개변수로받은데이터를출력하는메소드 41
메소드에값전달 (Argument passing) 방법 실습예제 ArgumentTest1.java 16 17 18 19 20 21 22 23 24 25 26 27 28 29 class ArgumentTest1 { public static void main(string args[]) { Argument d = new Argument(); int a = 10; int b[] = { 1, 2, 3, 4 ; StringBuffer c = new StringBuffer(" 배우기쉽죠?"); System.out.println(" 첫번째 display() 메소드호출 "); d.display(a, b, c); d.change(a, b, c); System.out.println("============================="); System.out.println(" 값을변환한다음두번째 display() 호출 "); d.display(a, b, c); 3 개의매개변수로 display() 호출 3 개의매개변수로 change() 호출 42
메소드에값전달 (Argument passing) 방법 43
메소드에값전달 (Argument passing) 방법 실습예제 ArgumentTest1.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 class Test { public void change(int i, int arr[]) { i = 20; arr[0]=20; class ex1 { public static void main(string args[]) { Test d = new Test(); int a = 10; int b[] = { 1, 2, 3 ; d.change(a, b); System.out.println("a = "+ a); System.out.println("b = "+ b[0]); 44
학습정리 생성자 생성자는클래스로부터객체가생성될때초기화과정을수행하는메소드 생성자의이름은클래스이름과동일해야함 생성자오버로딩 하나의클래스에같은이름의생성자를중첩하여선언하는것 오버로딩되는생성자는매개변수의개수나타입이반드시달라야함 생성자오버로딩은객체지향의다형성을구현 45
학습정리 예약어 this this 예약어는현재의객체를의미 this 예약어는클래스내에서다른생성자를호출할때도사용 메소드와오버로딩 메소드는클래스의핵심인기능을나타내는부분 메소드의접근한정자는객체변수의접근한정자의의미 클래스메소드는클래스이름을통해접근가능 - 클래스메소드내에서는클래스변수만을사용 메소드역시생성자와같이중첩사용될수있으며, 중첩된메소드는매개변수의개수와타입이반드시달라야함 46
학습정리 메소드에값전달기법 자바는메소드호출시매개변수에값을전하기위해값 - 전달 (call by value) 방법을사용 값 - 전달기법은실매개변수의값을형식매개변수에복사하는기법 매개변수의형이기본자료형일경우에는실제값이복사되어전달 참조자료형인경우에는주소가복사되어전달 (call by reference) 47