10. 숫자와 정적 변수 , 정적 메소드
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 PresentationTRANSCRIPT
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
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 가
리턴됨
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 변수의현재 값으로 지정된 곡이 재생
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() …
인스턴스 변수가 없기 때문에메소드의 행동이 인스턴스변수의 상태에 의해 전혀달라지지 않는다 .
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 발생
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 발생
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 생성자가 실행될때마다 그 값을 증가시킴
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 객체가
복사본 단 하나를 공유
- 인스턴스 변수
: 인스턴스마다 한 개씩
- 정적 변수
: 클래스마다 한 개씩
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)
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();
}}
정적 초기화 부문에서 초기화 하는 방법
클래스가 로딩되면 어떤 정적 메소드 ( 정적 변수 ) 도 로딩되기
전에 이 코드가 실행됨
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 로
Head First JAVA
핵심정리 (1/3)
13
정적 메소드는 객체 레퍼런스 변수 대신 클래스명을 써서 호출
Math.random() vs. myFoo.go()
정적 메소드는 힙에 그 메소드가 들어있는 클래스의 인스턴스가
없어도 호출할 수 있다 .
특정 인스턴스 변수 값에 의존하지 않는 유틸리티 메소드는 정적
메소드로 만드는 것이 좋다 .
정적 메소드에서는 특정 인스턴스와는 연관되지 않기 때문에 어떤
인스턴스 변수 값도 사용할 수 없다 .
정적 메소드에서는 정적 메소드가 아닌 메소드를 사용할 수 없다 .
Head First JAVA
핵심정리 (2/3)
14
정적 메소드만 들어있는 클래스가 있다면 그 클래스의 인스턴스를
만들 필요가 없기 때문에 생성자를 private 로 지정하는 것이
좋다 .정적 변수는 해당 클래스에 속하는 모든 객체에서 공유한다 .
정적 메소드에서도 정적 변수를 사용할 수 있다 .
자바에서 상수를 만들 때는 static 과 final 로 지정하면 된다 .
final 로 지정한 정적 변수는 반드시 초기화를 해야 한다 .
상수의 이름은 모두 대문자로 붙인다 .
Head First JAVA
핵심정리 (3/3)
15
final 인스턴스 변수 값은 선언할 때 또는 생성자에서 대입해야
함 .final 메소드는 오버라이드할 수 없다 .
final 클래스는 확장할 수 없다 .
final 로 지정한 변수 값은 값을 한 번 대입하면 바꿀 수 없다 .
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();
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);
}
오토박싱을 쓰는 경우
Head First JAVA
오토박싱 예 (1/2)
18
메소드 인자
: 어떤 메소드에서 래퍼 유형을 받아들인다면 , 래퍼에 대한 레퍼런스 , 또는 해당 유형의 원시 값을 인자로 사용할 수 있다 .
void takeNumber(Integer) { }
리턴 값
: 어떤 메소드에서 원시 유형을 리턴 유형으로 선언한 경우에 그 유형과
호환되는 원시 값 또는 해당 유형의 래퍼에 대한 레퍼런스 가운데
아무거나 리턴해도 된다 .
int giveNumber() { return x; }
Head First JAVA
오토박싱 예 (2/2)
19
부울 표현식
: 부울 값이 들어갈 자리에는 부울값을 결과로 가지는 표현식이나 원시
부울 값 , Boolean 래퍼에 대한 레퍼런스 가운데 어떤 것이든 집어넣을
수 있다 .
if (bool) { System.out.println(“true”); }
수에 대한 연산
: 원시 유형이 들어갈 자리에 래퍼 유형을 피연산자로 사용할 수 있다 .
Integer i = new Integer(42); i++; // i =43
대입
: 어떤 원시 유형 , 또는 래퍼 유형으로 선언된 변수에 원시 값과 래퍼 중
어떤 것이든 마음대로 대입할 수 있다 .
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 클래스에 들어있는정적 메소드를 사용하는 방법