객체의이용 지난강의에서우리는상자에대한모델을다루었다 : class Box { int Length; int Width; int Height; public void setlength (int NewLength) { Length = NewLength; public int getlength ( ) { return (Length); public void setwidth (int NewWidth) { Width = NewWidth; public int getwidth ( ) { return (Width); public void setheight (int NewHeight) { Height = NewHeight; public int getheight ( ) { return (Height); public int getvolume ( ) { return ( getlength( ) * getwidth( ) * getheight( ) ); 2
객체의선언 Box 클래스를사용하기위해서객체를선언 객체를선언하는것은사실은객체에대한참조를선언하는것을의미한다. 참조는특정클래스의객체를가리킬수있는함축적인지시자 (pointer) 이다. 선언예 : Box shoebox; Box 클래스의객체를만들지않는다. Box 클래스의객체를가리킬수있는 shoebox 라는참조변수 ( 혹은지시자 ) 를만든다. 참조변수는 Box 객체에대한지시자이나초기값으로 null 이라는기본값을가진다 : shoebox 3 객체와참조 shoebox 가 null 이아닌값을가지게하기위해서 Box 객체를만들필요가있다. 예를들면, shoebox = new Box( ); shoebox Box 클래스의한객체 자바가 new 라는 keyword 를만날때새로운객체가만들어지며그객체를위해메모리안에공간을할당한다. 위문장의실행결과 shoebox 는위그림과같이 Box 클래스의한객체를가리킨다. 그객체는 Box 클래스에서정의된모든변수들과메소드들을가진다. 각변수는고유한사본 (copy) 을가진다. 메소드들은그클래스의모든객체들사이에공유된다. 4
객체와참조 자세한내용 : shoebox ( 클래스 Box 의객체에대한참조 ) 데이터영역 : int Length; int Width; int Height; 데이터에적용되는메소드들 : public void setlength (int NewLength) public int getlength ( ) public void setwidth (int NewWidth) public int getwidth ( ) public void setheight (int NewHeight) public int getheight ( ) public int getvolume ( ) 5 Box shoebox = new Box(); Box cdbox = new Box(); 객체와참조 shoebox Box present = new Box(); 데이터영역 ( 속성들 ): int Length; 우리가 Box 객체를만들때마다우리는각객체변수의고유한사본을얻는다. 이는 OOP 의가장강력한면중의하나이다! int Width; int Height; cdbox 데이터 What 영역 can ( 속성들 be done ): to that data: int Length; public void setlength (int NewLength) int Width; public int getlength ( ) present int Height; public void setwidth (int NewWidth) public int getwidth ( ) What can public be done void to setheight that data: 데이터영역 ( (int NewHeight) public 속성들 void ): public setlength int getheight (int NewLength) int Length; ( ) public intpublic getlength int getvolume ( ) int Width; ( ) public void setwidth (int NewWidth) int Height; public int getwidth ( ) public void setheight (int NewHeight) 데이터에적용되는 public int 메소드들 getheight : ( ) public void setlength public (int int NewLength) getvolume ( ) public int getlength ( ) public void setwidth (int NewWidth) public int getwidth ( )... 6
참조대지시자 자바에는지시자가없다고한다. 실제로자바의변수는거의대부분이지시자이다. 모든기본형이아닌데이터는객체여야한다. 모든객체는참조를통해서접근하는동적데이터이다. 참조는사실상함축적인지시자이다. 자바는명확한지시자를가지지않는다 : 지시자를명백하게다루는방법이없다. 다시말해지시자연산 (pointer arithmetic) 이가능하지않다. 지시자에대해모른다면지시자는마술이다. 지시자에대해이해한다면참조가실제로무엇인지안다! 7 생성자메소드다중정의 클래스는하나이상의생성자메소드를가질수있다. 이경우에각생성자메소드는고유한형식매개변수의목록을가져야만한다. 생성자메소드호출시적어도하나의생성자메소드에대응되어야한다. 용어 : 같은이름을갖는메소드를여러개정의하는것을메소드다중정의 (method overloading) 라고부른다. 다음이주어지면 : public String ( ) public String (String value) 우리는다음과같이할수있다 : String Input1 = new String (); String Input2 = new String ( Year 2000 ); 그러면 Input1 은 라는값을갖는빈문자열이다. Input2 는 Year 2000 라는값을갖는문자열이다. 8
class Person { String Name; int Age; 예 : 생성자메소드 public Person (String NewName){ setname (NewName); public Person (String NewName, int NewAge) { setname (NewName); setage (NewAge); public void setname (String NewName){ Name = newname; public void setage (int NewAge) { Age = NewAge: // of Person 생성자메소드가변경자메소드를호출한다는것에유의하라. 9 생성자메소드 Person 클래스가만들어진후다음과같은 Person 객체를만들수있다 : Person guitarist1 = new Person ( HopeKid ); Person guitarist2 = new Person ( FutureKid, 27); 두개의생성자메소드중어느것인가는실제매개변수의수와유형이결정한다. 그래서우리는다음과같이할수없다 : public Person (String NewFirstName) {... // of constructor public Person (String NewLastName) {... // of constructor 질문 : 이유는? 10
기본생성자메소드 우리가생성자메소드를정의하지않는다면기본생성자메소드 (default constructor) 가자동적으로호출될것이다. 기본생성자메소드는어떠한매개변수도가지지않고아무일도하지않는다. Person 클래스의기본생성자메소드는다음과같다 : public Person ( ) { // of default constructor 대신에새로운기본생성자메소드를정의하여사용할수있다. 기본생성자메소드는객체변수들의값을표준자바의기본값들로초기화한다. 즉, 숫자형변수들은 0 으로논리형 (boolean) 변수들은 false 로참조형변수들은 null 로초기화한다. 11 객체와참조 기본데이터유형과객체들을구분해야한다 : Code: int x;? Memory: int y;?? x = 5; 5? y = x; 5 5 x y 12
객체와참조 Code: Memory: Box box1; Box box2; box1 box2 box1 = new Box(8, 5, 7); box1 box2 L=8, W=5, H=7 box2 = box1; // 주 : 두개의참조들이 // 한객체를가리킨다 box1 box2 L=8, W=5, H=7 box1 = new Box(3, 9, 2); box1 = box2; // 이전참조는쓰레기가된다! box1 box2 box1 box2 L=3, W=9, H=2 L=8, W=5, H=7 L=3, W=9, H=2 L=8, W=5, H=7 13 기본형에서동등의의미 : int Tigers; int Lions; Tigers = 9; Lions = 7; System.out.println(Tigers = = 9); System.out.println(Lions = = 7); System.out.println(Tigers = = Lions); Tigers = Lions; 객체와참조 Tigers 9 7 Tigers Lions // true를출력한다 // true를출력한다 // false를출력한다 Lions 7 7 System.out.println(Tigers = = 7); // true를출력한다 System.out.println(Lions = = 7); // true를출력한다 System.out.println(Tigers = = Lions); // true를출력한다 System.out.println(Tigers > Lions); // false를출력한다 (!) 14
객체와참조 객체에대한참조에서동등의의미 : 두가지의다른논리적검사가가능하다 : 1. = = ( 동등 ) 연산자 기본형에도적용 두개의참조가같은객체를가리키는지를알아본다. 2. equals( ) 메소드 객체에만적용 한객체의내용이다른객체의내용과같은지를알아본다. Object 라는클래스에이미만들어져있는특별한메소드로서모든클래스에서사용가능하다. 실제로특정클래스에서객체들을비교할수있도록 equals() 메소드를재정의할수있다. 여러분은모든데이터클래스에서이메소드를정의해야한다. 그렇지않으면동등연산자를이용한비교에매이게될수있다. 15 객체와참조 객체에대한참조에서동등의의미 : Box box1 = new Box(8, 5, 7); Box box2 = new Box(8, 5, 7); System.out.println(box1 = = box2); // false를출력한다 // box1 은 box2가가리키는같은객체를가리키는가? System.out.println(box1.equals(box2)); // true를출력한다 // box1은 box2가참조하는객체와같은내용을가지는객체를참조하는가? box1 L=8,W=5,H=7 box2 L=8,W=5,H=7 == 는두개의참조가메모리내의같은곳을가리키는지를비교한다!.equals( ) 는객체들이같은내용을가지고있는지를비교한다! 16
문자열과객체 모든문자열은자바의이미정의된 String 클래스의한실례이다. 따라서, 문자열은객체이다. 자바는문자열이자주사용되기때문에사용편의를위해추가적지원을한다 17 문자열과객체 자바는쌍따옴표안에있는텍스트를만날때마다자동적으로새로운문자열객체를만든다. 따라서다음코드는다음과같은세가지일을한다 : String str1 = Hello World ; 1. str1 이한문자열객체를가리킬수있는참조변수를선언한다. 2. 한문자열객체를만든다. 3. 그객체의값을 Hello World 로초기화한다. 이는자바가표준객체들을다루는방법과일치하지않는다. 표준객체의경우에는, 우리는명확하게 1. new 를통해객체를만들고, 2. 생성자메소드를통해초기화한다. 18
문자열과객체 Code: String str1; Box box1; Memory: str1 box1 str1 = Hello World ; box1 = Ln, Wd, Ht; 오류 : new str1 Hello World box1 new 와생성자메소드를사용해야한다 str1 = Hello World ; box1 = new Box(Ln, Wd, Ht); str1 box1 Hello World Ln, Wd, Ht str2 = new String(); str2?default? str2 = Test String ; str2?default? Test String 19 문자열지원기능들 1. 문자열객체를명백하게만들필요가없다. 2. 문자열들을하나로합치는것을지원하기위해 + 연산자가사용된다. 예를들면, System.out.println( Test + String ); 3. String 클래스에이미정의된메소드들이많이있다 : length( ) // 문자열의크기를되돌려준다 charat(index) // (index + 1) 번째위치에있는문자를되돌려준다. // 첫번째문자의지수는 0이다. substring(startindex) // (Startindex + 1) 번째위치에있는문자부터 // 끝문자까지의부분문자열을되돌려준다 substring(startindex, EndIndex) // (Startindex + 1) 번째위치에있는 // 문자부터 (Endindex - 1) 번째위치바로전에있는문자까지의 // 부분문자열을되돌려준다계속 20
예 : 문자열지원기능 String Example = Hello ; 0 1 2 3 4 H e l l o char c = Example.charAt(1); // c 의값은 e 이다 String substr1 = Example.substring(1); // substr1의값은 ello 이다 String substr2 = Example.substring(0, 4); // substr2 의값은 Hell 이다 21 우리는문자열객체의내용을변경시킬수없다 ( 문자열은불변이다 (immutable) ) 여러분은한문자열을수정하고있다고생각할지모른다. 그러나메모리에서실제로일어나는일은 : * 새로운문자열이생성된다 * 전문자열은수거될지모른다 ; 더이상그문자열을가리키는참조변수가없다 예를들면 : String str1 = Hello World str1 = str1.substring(4) 문자열과객체 str1 str1 Hello World Hello World o World 선택사항 : 이러한제한을극복하기위해서 StringBuffer 라는클래스를보아라. 22
자바매개변수 자바는두가지종류의매개변수를제공한다 : 값에의한넘김 (pass-by-value): 기본형값들을넘겨준다 참조값에의한넘김 (pass-by-constant-reference): 객체가가리키는참조값을넘겨준다 컴파일러가어느것을넘겨줄지를선택한다. 자바에서는여러분이넘겨주는방법을선택할수없다. 23 값에의한넘김 : 자바매개변수 한값이호출된메소드로넘어간다. 호출된메소드가원래값의한사본을얻는다. 참조값에의한넘김 : 호출이이루어질때객체를참조하는현재값이넘어간다. 호출된메소드가그값을읽을수는있으나변경할수는없다. 그값의일시적인사본만이변경될수있다 기술적으로미묘한차이가있으나실제적으로는차이가없다. 24
자바매개변수 public void exchange(int One, int Two) { System.out.println (One, +,, + Two); // line a int Temp = One; One = Two; Two = Temp; System.out.println (One, +,, + Two); // line b // of swap 그러면다음코드부분을수행하면 : int This = 5; int That = 6; System.out.println(This, +,, + That); // line c exchange(this, That); System.out.println(This, +,, + That); // line d 아래와같은결과를얻는다 : 5, 6 ( from line c ) 5, 6 ( from line a of exchange) 6, 5 ( from line b of exchange) 5, 6 ( from line d ) 25 자바매개변수 public void test (String Input) { System.out.println (Input); // line a Input = new string ; System.out.println (Input); // line b // of test 그러면다음코드부분을수행하면 : String Temp = original string ; System.out.println(Temp); // line c test(temp); System.out.println(Temp); // line d 아래와같은결과를얻는다 : original string ( from line c ) original string ( from line a of test) new string ( from line b of test) original string ( from line d ) 26
자바매개변수 값만이호출된메소드로넘어간다면우리가할일은?!? 지향을생각하라! 객체 데이터와메소드가캡슐화되어있다. 즉, 우리는객체에속하는데이터를읽거나변경하기위해객체의해당메소드를호출한다. 클래스내에서데이터는매개변수를거치지않고메소드에접근가능하다. 외부에서의접근은객체에게메소드를통해해달라고요청함으로써이루어진다 : 접근자 ( get ) 메소드 : 값을되돌려주는함수 변경자 ( set ) 메소드 : 데이터상태를바꿔주는프로시져 객체밖에서는메소드를통해접근한다. 27 자바매개변수 자바매개변수는입력데이터를제공하기위해사용되는메소드의일부로서선언된다 따라서매개변수는메소드의지역변수로간주된다 이는매개변수가메소드가호출될때자동적으로만들어진다는것을의미한다 메소드가종료될때매개변수는자동적으로없어진다 보통지역변수와는달리객체를만들거나초기화를할필요가없다. 왜냐하면실제매개변수의값이메소드로넘어올때이러한일들이처리되기때문이다 28
객체대클래스선언 변수는객체변수 (instance variable) 와클래스변수 (class variable) 로나뉜다 메소드도객체메소드 (instance method) 와클래스메소드 (class method) 로나뉜다 객체변수나메소드는한클래스의객체에속한다 클래스변수나클래스메소드는클래스에속한다 static 이라는키워드가클래스변수혹은클래스메소드를나타낸다. 이키워드가없으면객체변수나객체메소드를나타낸다. 29 객체대클래스변수 우리가생성된객체들의총수를알고싶다고가정하자. 다음을고려하라 : class Human { String Name; int Population = 0; public Human (String Name) { this.name = Name; Population++; // 틀림! 각객체에대해 Name 이라는변수를선언한다. 따라서, 각 Human 객체는자신의이름을가진다. 그러나... Human 의각객체에대해 Population 이라는계수기를선언한다. 따라서, 각 Human 객체는 1 의값을가지는자신의 Population 이라는변수를가진다. 이는적절하지않다! 30
객체대클래스변수 class Human { String Name; static int Population = 0; public Human (String Name) { this.name = Name; Population++; 각객체에대해 Name이라는변수를선언한다. 따라서, 각 Human 객체는자신의이름을가진다. 추가 주 : 각 Human 객체는 Population 이라는계수기를가지지않는다. 클래스변수인 Human 클래스에대한 Population 이라는계수기를정의한다. 따라서, 각 Human 객체는이공유하는계수기를하나만큼증가시킬것이다. 31 객체대클래스변수 각객체가자신의변수를가져야만할때객체변수를사용하라 예 : 특정객체의속성들 클래스자체가모든객체들에관한데이터의한사본을유지해야할때클래스변수를사용한다 예 : 인구세기, 요약데이터, 순번부여, 공유자원 32
객체대클래스변수 상수 : class ConstantExample { final int MAXSIZE = 10; 각객체마다다르나사실상같은상수를선언한다. 이는이득이없는낭비다. class ConstantExample { static final int MAXSIZE = 10; 클래스의모든객체들에의해사용되는한공용상수를선언한다. 33 메소드호출 메소드는객체혹은클래스를대상으로호출되어야한다. 또한그메소드가어느객체혹은어느클래스에적용되어야하는지분명해야한다. 어떤메소드호출이클래스내에있다면그클래스가해당되는메소드를포함한다고가정된다. class CompanyStock { public double getamountearned ( ) { double Open = getopenvalue(); /* 이클래스내의메소드를호출한다 */ double Close = getclosevalue(); /* 이클래스내의메소드를호출한다 */... public double getopenvalue() { return 1234.5d; public double getclosevalue(){ return 2345.6d; 34
호출되는메소드가클래스내에정의되어있지않다면해당클래스나객체가명시되어야한다 class StockstreetJitters {... public void panicsell ( ) { BankChair chongjae = new BankChair(); if (chongjae.raiseinterest()) { buyonmargin(); else { sellallstock(); 메소드호출 사용구문 : < 객체참조변수 >.< 메소드이름 > 35 변수의범위 지역변수 ( 메소드의일부로서선언된 ): 메소드안에서만볼수있다 메소드밖에서는지역변수는아무런의미가없다 객체변수와클래스변수 ( 클래스의일부로선언된 ): 객체에서는어디서든지볼수있다 이는클래스내에서정의된메소드안에서매개변수로값을넘겨주지않고도변수값을볼수있다는것을의미한다 그범위를넘어서는값을볼수도있고볼수없을수도있다 메소드내에서지역변수명이객체변수명보다우선순위가높다 36
클래스라이브러리 클래스라이브러리는프로그램을개발할때사용할수있는클래스들의모음이다 자바표준클래스라이브러리는자바개발환경의일부이다 클래스라이브러리에있는클래스들은자바언어의일부가아니다. 그러나우리는그클래스들에많이의존한다 우리가이미사용해왔던 System, Scanner, String 과같은클래스들은자바표준클래스라이브러리의일부이다 37 패키지 자바표준클래스라이브러리의클래스들은패키지들로구분된다 주요패키지들 java.lang 일반적인지원 java.applet 웹을위한애플릿들의작성 java.awt 그래픽스와그래픽사용자인터페이스 java.swing 추가적인그래픽사용자인터페이스기능들 java.net 네트워크통신 java.util 일반적인유틸리티 java.io 입출력지원 38
import 선언 한패키지에있는클래스들을사용하기위해서우리는완전한클래스이름을쓰거나 import 선언문을사용해야한다 예 : import java.util.scanner; import java.util.*; 39 Random 클래스 Random 클래스는 java.util 패키지의일부로서의사난수들을생성하는메소드들을제공한다 주요메소드들 nextint(int num) : 0 과 num - 1 사이에있는난수를되돌려준다 nextfloat() : 0.0 과 1.0( 포함안함 ) 사이에있는난수를되돌려준다 40
예제프로그램 1: 주사위던지기모의실험 import java.util.random; public class SimulateDie { public static void main(string[] args) { Random generator = new Random(); int i, randomnumber; for (i = 1; i <= 5; i++) { randomnumber = generator.nextint(6)+1; System.out.println(i + 번째난수는 + randomnumber + 이다. ); 41 Math 클래스 Math 클래스는 java.lang 패키지의일부이다 Math 클래스는많은기본적인수학함수들을수행하는메소드들을포함한다 주요메소드들 : abs(int num) : num 의절대값을되돌려준다 sin(double angle) : angle 의 sin 값을되돌려준다 sqrt(double num) : num 의제곱근값을되돌려준다 42
Math 클래스 모든메소드들은클래스메소드이다 클래스이름을이용하여메소드를호출할수있다 예 : c = Math.sqrt(a * a + b * b); 43 예제프로그램 2: 직각삼각형빗변계산 import java.util.scanner; public class CalHypotenuse { public static void main (String[]args) { double a, b, c; Scanner scan = new Scanner (System.in); System.out.print( 밑변의길이를입력하세요 : ); a = scan.nextdouble(); System.out.print( 높이의길이를입력하세요 : ); b = scan.nextdouble(); // 빗변의길이를구한다 c = Math.sqrt(a * a + b * b); System.out.println( 빗변의길이는 " + c + 이다. ); 44
포장자클래스 포장자 (wrapper) 클래스는특정기본형값을나타내는클래스이다 기본형 byte short int long float double char boolean 포장자클래스 Byte Short Integer Long Float Double Character Boolean 45 포장자클래스 다음은정수 40 을객체로서나타내는 Integer 객체를생성한다 : Integer age = new Integer(40); 이객체는프로그램에서객체가필요한곳에서사용될수있다 Integer 클래스는한 String 객체에저장된정수값을대응하는 int 값으로변환하는 parseint 라는클래스메소드를포함한다예 : int num = Integer.parseInt( 123 ); 46
Autoboxing 과 Unboxing Autoboxing 은기본형값과대응하는포장자객체사이의자동변환이다 Integer obj1; int num1 = 12; obj1 = num1; // 자동적으로 Integer 객체를생성 반대과정인 unboxing 은역시필요할때자동적으로일어난다 Integer obj2 = new Integer(12); int num2; num2 = obj2; 47 요약 객체와참조 문자열과객체 매개변수 객체와클래스선언 메소드호출 기존클래스사용 포장자클래스 48