10. 숫자와 정적 변수 , 정적 메소드

20
10. 숫숫숫 숫숫 숫숫 , 숫숫 숫숫숫

Upload: morley

Post on 07-Feb-2016

131 views

Category:

Documents


0 download

DESCRIPTION

10. 숫자와 정적 변수 , 정적 메소드. Math 메소드 (1/2). Math 클래스에 들어있는 메소드는 정적이어서 인스턴스 변수가 필요 없기 때문에 Math 클래스만 있으면 된다. int x = Math.round (42.2); int y = Math.min(56.12); int z = Math.abs(-343);. 이런 메소드에서는 인스턴스 변수를 전혀 사용하지 않기 때문에 객체마다 행동이 달라지는 일이 없다. Math mathObject = new Math();. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 10.  숫자와 정적 변수 ,  정적  메소드

10. 숫자와 정적 변수 , 정적 메소드

Page 2: 10.  숫자와 정적 변수 ,  정적  메소드

Head First JAVA

Math 메소드 (1/2)

2

Math 클래스에 들어있는 메소드는 정적이어서 인스턴스 변수가 필요 없기 때문에 Math 클래스만 있으면 된다 .

int x = Math.round(42.2); int y = Math.min(56.12); int z = Math.abs(-343);

이런 메소드에서는 인스턴스 변수를 전혀 사용하지 않기 때문에 객체마다 행동이 달라지는 일이 없다 .

Math mathObject = new Math();

다음과 같이 Math 클래스의인스턴스를 만들면 … 오류 발생

TestMath.java:3: Math() has privateAccess in java.lang.Math

Math mathObject = new Math();1 error

Page 3: 10.  숫자와 정적 변수 ,  정적  메소드

Head First JAVA

Math 메소드 (2/2)

3

Math.random() : 0.0 이상 1.0 미만의 double 값을 리턴

int r2 = (int) (Math.ramdom() * 5); // 0 ~ 4 의 정수값이

리턴됨Math.abs() : 주어진 인자의 절대값을 리턴

inx x = Math.abs(-240); // 240 이 리턴됨

Math.round() : 주어진 수를 반올림하여 리턴

int x = Math.round(-24.8f); // -25 가 리턴됨

Math.min() : 두 인자 중 더 작은 값을 리턴

Double x = Math.min(90876.5, 90876.49); // 90876.49 가

리턴됨Math.max() : 두 인자 중 더 작은 값을 리턴

Double y = Math.max(90876.5, 90876.49); // 90876.5 가

리턴됨

Page 4: 10.  숫자와 정적 변수 ,  정적  메소드

Head First JAVA

정적 메소드 (1/4)

4

static 이라는 키워드를 사용하면 클래스의 인스턴스 없이 메소드를 실행할 수 있다 .

public class Song { String title; public Song(String t) {

title = t; } public void play() {

SoundPlayer player = new SoundPlayer();

player.playSound(title); }

}

일반 메소드인스턴스 변수의 값이 play()메소드의 행동에 영향을 미침

play() 를 호출하면 title 변수의현재 값으로 지정된 곡이 재생

Page 5: 10.  숫자와 정적 변수 ,  정적  메소드

Head First JAVA

정적 메소드 (2/4)

5

public static int min(int a, int b) { // a 와 b 중에서 더 작은 것을 리턴

}

Math.min(42, 36); // 36 리턴

정적 메소드

레퍼런스 변수명이 아닌클래스명을 사용

Math

min() max() abs() …

인스턴스 변수가 없기 때문에메소드의 행동이 인스턴스변수의 상태에 의해 전혀달라지지 않는다 .

Page 6: 10.  숫자와 정적 변수 ,  정적  메소드

Head First JAVA

정적 메소드 (3/4)

6

정적 메소드에서는 정적 변수가 아닌 변수 사용 불가

public class Duck { private int size; public static void main (String [] args) {

System.out.println (“Size of duck is “ + size);

} public void setSize(int s) {

size = s; } public int getSize() {

return size; }

}

정적 메소드에서 인스턴스 변수를 사용하려고 하면 컴파일러에서는 어떤 객체의 인스턴스 변수를 말하는지 알수 없어 error 발생

Page 7: 10.  숫자와 정적 변수 ,  정적  메소드

Head First JAVA

정적 메소드 (4/4)

7

정적 메소드에서는 정적 메소드가 아닌 메소드도 사용 불가

정적 메소드에서 인스턴스 변수를 사용하려고 하면 컴파일러에서는 어떤 객체의 인스턴스 변수를 말하는지 알수 없어 error 발생

public class Duck { private int size; public static void main (String [] args) {

System.out.println (“Size of duck is “ getSize());

} public void setSize(int s) {

size = s; } public int getSize() {

return size; }

}

getSize() 에서는 size 인스턴스 변수를 사용해야 하기 대문에 getSize()를 호출하면 error 발생

Page 8: 10.  숫자와 정적 변수 ,  정적  메소드

Head First JAVA

정적 변수 (1/2)

8

클래스의 어떤 인스턴스에서든 값이 같음

public class Duck { private int size; private static int duckCount =

0; public Duck() {

duckCount++; } public void setSize(int s) {

size = s; } public int getSize() {

return size; }

}

처음 로딩될 때만 초기화매번 인스턴스가 만들어질 때마다 초기화되지 않음

duckCount 가 정적변수라서그 값이 0 으로 재설정되지않아 Duck 생성자가 실행될때마다 그 값을 증가시킴

Page 9: 10.  숫자와 정적 변수 ,  정적  메소드

Head First JAVA

정적 변수 (2/2)

9

Duck size static duckCount getSize() setSize()

size: 20static dC:

3Duck 객체

size: 22static dC:

3Duck 객체

size: 12static dC:

3Duck 객체

각 Duck 객체마다 size 변수를 가지고 있지만

duckCount 는 정적

변수기

때문에 모든 Duck 객체가

복사본 단 하나를 공유

- 인스턴스 변수

: 인스턴스마다 한 개씩

- 정적 변수

: 클래스마다 한 개씩

Page 10: 10.  숫자와 정적 변수 ,  정적  메소드

Head First JAVA

정적 변수 초기화

10

class Player { static int playerCount = 0; private String name;

public Player(String n) { name = n; playerCount++;

} } public class PlayerTestDrive {

public static void main (String [] args) { System.out.println(Player.playerCount); Player one = new Player(“Tiger

Woods”); System.out.println(Player.playerCount);

} }

% java PlayerTestDrive 0 1

인스턴스를 만들기 전

객체 한 개를 생성한 후

정적 변수도 인스턴스 변수처럼

초기화하지 않으면 기본값으로

초기화 된다 . (0, 0.0, false, null)

Page 11: 10.  숫자와 정적 변수 ,  정적  메소드

Head First JAVA

static final (1/2)

11

static final 로 선언된 변수는 상수이다 . 절대 변경 불가

public class Foo { public static final int FOO_X =

25; }

상수의 변수명은 모두 대문자로 이루어진 이름을 붙인다

선언할 때 초기화하는 방법

public class Bar {public static final double BAR_SIGN;static {

BAR_SIGN = (double) Math.random();

}}

정적 초기화 부문에서 초기화 하는 방법

클래스가 로딩되면 어떤 정적 메소드 ( 정적 변수 ) 도 로딩되기

전에 이 코드가 실행됨

Page 12: 10.  숫자와 정적 변수 ,  정적  메소드

class Foof { final int size = 3;…

}

final class MyMostPerfectClass {

// 이 클래스는 확장할 수 없음 }

class 를 final로

Head First JAVA

static final (2/2)

12

size 의 값을 변경할 수 없음정적 변수가 아닌 변수를 final로

class Poof { final void calcWhuffie() { // 절대로 오버로이드 하면 안 되는

// 중요한 메소드 }

}

메소드를 final 로

Page 13: 10.  숫자와 정적 변수 ,  정적  메소드

Head First JAVA

핵심정리 (1/3)

13

정적 메소드는 객체 레퍼런스 변수 대신 클래스명을 써서 호출

Math.random() vs. myFoo.go()

정적 메소드는 힙에 그 메소드가 들어있는 클래스의 인스턴스가

없어도 호출할 수 있다 .

특정 인스턴스 변수 값에 의존하지 않는 유틸리티 메소드는 정적

메소드로 만드는 것이 좋다 .

정적 메소드에서는 특정 인스턴스와는 연관되지 않기 때문에 어떤

인스턴스 변수 값도 사용할 수 없다 .

정적 메소드에서는 정적 메소드가 아닌 메소드를 사용할 수 없다 .

Page 14: 10.  숫자와 정적 변수 ,  정적  메소드

Head First JAVA

핵심정리 (2/3)

14

정적 메소드만 들어있는 클래스가 있다면 그 클래스의 인스턴스를

만들 필요가 없기 때문에 생성자를 private 로 지정하는 것이

좋다 .정적 변수는 해당 클래스에 속하는 모든 객체에서 공유한다 .

정적 메소드에서도 정적 변수를 사용할 수 있다 .

자바에서 상수를 만들 때는 static 과 final 로 지정하면 된다 .

final 로 지정한 정적 변수는 반드시 초기화를 해야 한다 .

상수의 이름은 모두 대문자로 붙인다 .

Page 15: 10.  숫자와 정적 변수 ,  정적  메소드

Head First JAVA

핵심정리 (3/3)

15

final 인스턴스 변수 값은 선언할 때 또는 생성자에서 대입해야

함 .final 메소드는 오버라이드할 수 없다 .

final 클래스는 확장할 수 없다 .

final 로 지정한 변수 값은 값을 한 번 대입하면 바꿀 수 없다 .

Page 16: 10.  숫자와 정적 변수 ,  정적  메소드

Head First JAVA

원시유형 포장

16

int x = 32; ArrayList list = new ArrayList(); list.add(x);

원시 형식을 객체처럼 다루려면 포장을 하면 된다 .(java 5.0 이전 )

5.0 이전 버전에서는 작동하지 않는다ArrayList 의 add() 메소드에서 원시 값이 아닌 객체 레퍼런스만은 인자로 받아들이기 때문

Boolean Character Byte Short Integer Long Float Double

int i = 288; Integer iWrap = new Integer(i);

값을 포장하는 방법

int unWrapped = iWrap.intValue();

포장을 벗겨 값을 구하는 방법

원시 값을 래퍼 생성자에전달하기만 하면 된다 .

Boolean : booleanValue();Character : charValue();

Page 17: 10.  숫자와 정적 변수 ,  정적  메소드

Head First JAVA

오토박싱

17

public void doNumOldWay() { ArrayList listOfNumbers = new

ArrayList(); listOfNumbers.add(New Integer(3)); Integer one = (Integer)

listOfNumbers.get(0); int intOne = one.intValue();

}

오토박싱을 쓰지 않는 경우

public void doNumNewWay() { ArrayList<Integer> listOfNumbers = new

ArrayList<Integer>(); listOfNumbers.add(3); int num = listofNumbers.get(0);

}

오토박싱을 쓰는 경우

Page 18: 10.  숫자와 정적 변수 ,  정적  메소드

Head First JAVA

오토박싱 예 (1/2)

18

메소드 인자

: 어떤 메소드에서 래퍼 유형을 받아들인다면 , 래퍼에 대한 레퍼런스 , 또는 해당 유형의 원시 값을 인자로 사용할 수 있다 .

void takeNumber(Integer) { }

리턴 값

: 어떤 메소드에서 원시 유형을 리턴 유형으로 선언한 경우에 그 유형과

호환되는 원시 값 또는 해당 유형의 래퍼에 대한 레퍼런스 가운데

아무거나 리턴해도 된다 .

int giveNumber() { return x; }

Page 19: 10.  숫자와 정적 변수 ,  정적  메소드

Head First JAVA

오토박싱 예 (2/2)

19

부울 표현식

: 부울 값이 들어갈 자리에는 부울값을 결과로 가지는 표현식이나 원시

부울 값 , Boolean 래퍼에 대한 레퍼런스 가운데 어떤 것이든 집어넣을

수 있다 .

if (bool) { System.out.println(“true”); }

수에 대한 연산

: 원시 유형이 들어갈 자리에 래퍼 유형을 피연산자로 사용할 수 있다 .

Integer i = new Integer(42); i++; // i =43

대입

: 어떤 원시 유형 , 또는 래퍼 유형으로 선언된 변수에 원시 값과 래퍼 중

어떤 것이든 마음대로 대입할 수 있다 .

Page 20: 10.  숫자와 정적 변수 ,  정적  메소드

Head First JAVA

래퍼 메소드

20

String s = “2”; int x = Integer.parseInt(s); double d = Double.parseDouble(“420.24”); boolean b = new Boolean(“true”).booleanValue();

String 을 원시 값으로

변환

double d = 42.5; String doubleString = “”+d; double d = 42.5; String doubleString = Double.toString(d);

원시 값을 String 으로

변환

parseBoolean() 같은 메소드가 있을 것 같지만 없고 , 생성자를 써서 객체를 만든 다음 booleanValue() 로 원시 값을 변환할 수 있다 .

String 에 어떤 값을 붙이든그 값은 String 으로 바뀐다 .

Double 클래스에 들어있는정적 메소드를 사용하는 방법