4 장. 객체의행동 학습목표 1. 인스턴스변수와메소드의상호관계에대해알아봅니다. 2. 매개변수와리턴값에대해알아봅니다. 3. 객체의동치에대해알아봅니다.
객체의행동 이렇게하면상태가확바뀌겠죠? 상태 인스턴스변수행동 메소드
객체의상태와행동 Song 인스턴스변수 ( 상태 ) 메소드 ( 행동 ) title artist settitle() setartist() play() 아는것 하는것
객체의상태와행동 void play() { soundplayer.playsound(title); Song t2 = new Song(); t2.setartist( Travis ); t2.settitle( Sing ); Song s3 = new Song(); s3.setartist( Sex Pistols ); s3.settitle( My Way ); Darkstar Grateful Dead Sing Travis Politik Coldplay My Way Sex Pistols My Way Sinatra t2.play(); t2 Song s3.play(); s3 Song
객체의상태와행동 class Dog { int size; String name; void bark() { if (size > 60) { System.out.println("Woof! Woof!"); else if (size > 14) { System.out.println("Ruff! Ruff!"); else { System.out.println("Yip! Yip!"); size Dog name bark() class DogTestDrive { public static void main(string[] args) { Dog one = new Dog(); one.size = 70; Dog two = new Dog(); two.size = 8; Dog three = new Dog(); three.size = 35; Bark Different. one.bark(); two.bark(); three.bark(); 코드를직접실행시켜봅시다.
매개변수 / 인자 자바에서도메소드에어떤값을전달할수있습니다. 매개변수 메소드에서사용하는것 인자 호출하는쪽에서전달하는것 메소드에서받은매개변수는그메소드에서선언한지역변수와똑같이간주됩니다. 메소드에매개변수가있으면반드시해당유형의값을전달해야만합니다.
매개변수 / 인자 1. bark 메소드호출 ( 인자로 3 을전달 ) 2. 3 이라는값을 Dog d = new Dog(); d.bark(3); 나타내는비트들이 bark 메소드로전달됨 void bark(int numofbarks) { while (numofbarks > 0) { System.out.println( ruff ); numofbarks = numofbarks 1; 3. 그비트들이 numofbarks 매개변수에들어감 4. numofbarks 매개변수를메소드코드내에서변수로사용
리턴값 메소드로부터값을받을수도있습니다. void go() { int givesecret() { return 42; 리턴유형은메소드를선언할때지정하며, 리턴유형이정해져있으면반드시그유형의값을리턴해야만합니다.
리턴값 int thesecret = life.givesecret(); int givesecret() { return 42;
두개이상의매개변수 메소드에두개이상의인자를전달할수도있습니다. 각인자는쉼표로구분합니다. 메소드에매개변수가있을때반드시인자를전달해야한다는원칙은여전히적용됩니다.
두개이상의매개변수 void go() { int foo = 7; void go() { int bar = 3; TestStuff t = new TestStuff(); t.taketwo(foo, bar); t.taketwo(12, 34); void taketwo(int x, int y) { int z = x + y; System.out.println( Total is + z);
값으로전달 (pass by value) 자바에서는값으로전달하는방식을사용합니다.
값으로전달 (pass by value) int x = 7; x void go(int z) { z int int x foo.go(x); x z x z int int void go(int z) { int void go(int z) { z = 0; int
바보같은질문은없습니다. 전달하려고하는인자가원시변수가아니고객체인경우에는어떻게되나요? 객체레퍼런스를인자로전달하는경우에도여전히값으로만전달됩니다. 중요한것은여기에서 값 이라는것이 객체 가아니라, 객체를참조하는레퍼런스라는점입니다. 따라서그레퍼런스의복사본이전달됩니다.
바보같은질문은없습니다. 메소드에서리턴값을여러개선언할수있나요? 값을두개이상리턴하는방법이있나요? 리턴값은한가지밖에선언할수없습니다. 하지만세개의 int 를리턴하고싶다면리턴유형을 int 배열로선언하면됩니다. 여러유형의값을리턴하는방법은조금더복잡한데, 나중에배우게될 ArrayList 라는것을사용하면됩니다.
바보같은질문은없습니다. 정확하게처음에선언한유형으로만리턴해야하나요? 자동으로해당유형으로변환되는것은그냥리턴해도됩니다. 예 : int 를리턴하겠다고선언한경우에 byte 를리턴해도됩니다. 하지만그렇지않은경우에는강제로캐스팅을해야합니다. 예 : return (int) (Math.random() * 10.0);
바보같은질문은없습니다. 메소드에서리턴한값으로반드시뭔가를해야하나요? 그냥무시하면안되나요? 자바에서는리턴값의사용여부에는전혀신경을쓰지않습니다. 따라서리턴값을꼭어떤변수에대입한다거나특정한용도로사용하지않아도됩니다. 예를들어리턴값은별로필요없고메소드로어떤작업을하기만되는경우에는리턴값은그냥무시하고메소드를호출하기만해도됩니다.
핵심정리 클래스에서는객체가하는것과객체가아는것을정의합니다. 인스턴스변수 ( 상태 ) 는객체가아는것입니다. 메소드 ( 행동 ) 는객체가하는것입니다. 메소드에서인스턴스변수를이용하여같은형식의객체가다른식으로행동하도록할수있습니다. 메소드에서매개변수를사용할수있습니다. 즉메소드에한개이상의값을전달할수있습니다.
핵심정리 전달하는값의개수와유형은반드시메소드를선언할때지정한것과같아야하며그순서도같아야합니다. 메소드안팎으로전달되는값은상황에따라자동으로더큰유형으로올라갈수있습니다. 더작은유형으로바꿀때는강제로캐스팅을해야합니다. 메소드에인자를전달할때는리터럴값 (2, c 등 ) 을사용할수도있고선언된매개변수유형의변수 ( 예를들어 int 변수 x) 를사용할수도있습니다.
핵심정리 메소드를선언할때는반드시리턴유형을지정해야합니다. 리턴유형을 void 로지정하면아무것도리턴하지않아도됩니다. 메소드를선언할때 void 가아닌리턴유형을지정했을때는반드시선언된리턴유형과호환가능한값을리턴해야합니다.
게터 (getter) 와세터 (setter) 게터 (getter) 인스턴스변수의값을알아내기위한메소드 일반적으로인스턴스변수의값을리턴함 getbrand(), getnumofpickups() 세터 (setter) 인스턴스변수의값을설정하기위한메소드 전달된값을확인하고인스턴스변수의값을설정함 setbrand(), setnumofpickups()
게터와세터 class ElectricGuitar { String brand; int numofpickups; boolean rockstarusesit; String getbrand() { return brand; void setbrand(string abrand) { brand = abrand; int getnumofpickups() { return numofpickups; void setnumofpickups(int num) { numofpickups = num; boolean getrockstarusesit() { return rockstarusesit; void setrockstarusesit(boolean yesorno) { rockstarusesit = yseorno;
캡슐화 (encapsulation) 데이터노출!!! 지금까지우리가만든프로그램에는데이터가완전히노출되어있다는심각한문제가있었습니다. 즉아무나인스턴스변수를마음대로보고건드릴수있었습니다. thecat.height = 27; thecat.height = 0; 이렇게 thecat 이라는객체의 height 변수의값을마음대로 0 으로바꿀수있으면안됩니다.
캡슐화 이런문제를어떻게해결할수있을까요? 세터메소드를쓰면됩니다. thecat.height = 0; public void setheight(int ht) { if (height > 9) { height = ht; 세터메소드를사용하면이렇게인스턴스변수의값이합당한지검사할수도있습니다.
캡슐화 그렇다면데이터를직접건드릴수없도록하려면어떻게해야할까요? 액세스변경자 (access modifier) 인스턴스변수 : private 으로선언 게터및세터메소드 : public 으로선언
캡슐화실습 GoodDog class GoodDog { private int size; public int getsize() { return size; size getsize() setsize() Bark() public void setsize(int s) { size = s; void bark() { 112 페이지에있는예제를직접실행시켜봅시다.
배열안에있는객체 1. Dog 배열변수선언 Dog[] pets; pets = new Dog[7]; Dog 배열객체 (Dog[]) pets Dog[]
배열안에있는객체 2. 두개의새로운 Dog 객체를만들고두개의배열원소대입 pets[0] = new Dog(); pets[1] = new Dog(); Dog 객체 Dog 객체 3. Dog 객체두개에대해메소드호출 pets[0].setsize(30); int x = pets[0].getsize(); pets[1].setsize(8); Dog 배열객체 (Dog[]) pets Dog[]
인스턴스변수초기화 인스턴스변수선언 int size; String name; 인스턴스변수선언및초기화 int size = 420; String name = Donny ;
인스턴스변수의기본값 class PoorDog { private int size; private String name; public int getsize() { return size; public String getname() { return name; public class PoorDogTestDrive { public static void main(string[] args) { PoorDog one = new PoorDog(); System.out.println( Dog size is + one.getsize()); System.out.println( Dog name is + one.getname()); 114 페이지에있는예제를직접실행시켜봅시다.
인스턴스변수의기본값 인스턴스변수에는항상기본값이들어갑니다. 각유형별기본값 정수 0 부동소수점수 0.0 부울 false 레퍼런스 null
인스턴스변수와지역변수 선언되는위치 인스턴스변수 클래스내에서 지역변수 메소드내에서 초기화 인스턴스변수 기본초기값이 // 나머지코드있음 지역변수 기본초기값이없음 class Horse { private double height = 15.2; private String breed; class AddThing { class Foo { public public int void add() go() { { int int total x; = a + b; return int z total; = x + 3;
바보같은질문은없습니다. 메소드매개변수는어떤가요? 지역변수와관련된규칙이매개변수에는어떻게적용되죠? 메소드매개변수는지역변수와거의똑같습니다. 메소드내에서선언되지요. 다만메소드를호출할때필요한인자를전달하지않으면컴파일과정에서에러가나기때문에매개변수가초기화되지않았다는에러메시지가뜨는일은없습니다.
변수비교 == 연산자 임의의유형의두변수를비교하기위한연산자 비트패턴을비교합니다. a int 원시값 두값을직접비교합니다. 레퍼런스 == 두변수가같은객체를참조하는지를비교합니다. b byte int Foo a = a 3; = new Foo(); byte Foo b = b 3; = new Foo(); if (a Foo == c b) = a; { // 참 if (a == b) { // 거짓 if (a == c) { // 참 if (b == c) { // 거짓
연필을깎으며 int calcarea(int height, int width) { return height * width; 메소드를제대로호출한부분은? int a = calcarea(7, 12); short c = 7; calcarea(c, 15); int d = calcarea(57); calcarea(2,3); long t = 42; int f = calcarea(t, 17); int g = calcarea(); calcarea(); byte h = calcarea(4, 20); int j = calcarea(2, 3, 5);