![](https://t1.daumcdn.net/cfile/tistory/2327E93A552C810F02)
![](https://t1.daumcdn.net/cfile/tistory/24615D3A552C811019)
![](https://t1.daumcdn.net/cfile/tistory/246BBE3A552C811214)
![](https://t1.daumcdn.net/cfile/tistory/24762E3A552C811312)
![](https://t1.daumcdn.net/cfile/tistory/215AD83A552C81151B)
![](https://t1.daumcdn.net/cfile/tistory/2267C03A552C811717)
![](https://t1.daumcdn.net/cfile/tistory/22788D3A552C811911)
![](https://t1.daumcdn.net/cfile/tistory/252A2C36552C811B19)
![](https://t1.daumcdn.net/cfile/tistory/27260236552C811D1B)
![](https://t1.daumcdn.net/cfile/tistory/23477B36552C811F08)
![](https://t1.daumcdn.net/cfile/tistory/27410F36552C81210D)
![](https://t1.daumcdn.net/cfile/tistory/221D6C36552C81231E)
![](https://t1.daumcdn.net/cfile/tistory/27288D36552C81251B)
![](https://t1.daumcdn.net/cfile/tistory/2240D036552C81270C)
![](https://t1.daumcdn.net/cfile/tistory/276FD94A552C81290C)
![](https://t1.daumcdn.net/cfile/tistory/2101684A552C812B04)
![](https://t1.daumcdn.net/cfile/tistory/256E354A552C812E0D)
![](https://t1.daumcdn.net/cfile/tistory/2104DA4A552C813002)
![](https://t1.daumcdn.net/cfile/tistory/2505044A552C813102)
![](https://t1.daumcdn.net/cfile/tistory/2716944A552C813438)
10. 숫자와정적변수, 정적메소드10. 숫자와정적변수, 정적메소드
1
Math 메소드 (1/2)
Math 클래스에 들어있는 메소드는 정적이어서 인스턴스 변수가
필요 없기 때문에 Math 클래스만 있으면 된다 .
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();
다음과 같이 Math 클래스의
인스턴스를 만들면 … 오류 발생
이런 메소드에서는 인스턴스 변수를
전혀 사용하지 않기 때문에 객체마다
행동이 달라지는 일이 없다 .
TestMath.java:3: Math() has private
Access in java.lang.Math
Math mathObject = new Math();
1 error
Math 메소드(2/2)
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 가
리턴됛
정적메소드(1/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 변수의현재값으로지정된곡이재생정적메소드(1/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 변수의현재값으로지정된곡이재생
정적메소드(2/4) 정적메소드(2/4)
public static int min(int a, int b) {
// a와b 중에서더작은것을리턴}
Math.min(42, 36); // 36 리턴정적메소드
인스턴스
변수가
없기
때문에
메소드의
행동이
인스턴스
레퍼런스
변수명이
아닌
변수의
상태에
의해
전혀
Math
min()
max()
abs()
…
클래스명읁
사용
달라지즞
않는다
.
정적 메소드 (3/4)
정적 메소드에서는 정적 변수가 아닌 변수 사용 불가
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 발생
정적 메소드 (3/4)
정적 메소드에서는 정적 변수가 아닌 변수 사용 불가
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 발생
정적 메소드 (4/4)
정적 메소드에서는 정적 메소드가 아닌 메소드도 사용 불가
정적 메소드에서 인스턴스
변수를 사용하려고 하면
컴파일러에서는 어떤 객체의
인스턴스 변수를 말하는지 알
수 없어 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 발생
정적 메소드 (4/4)
정적 메소드에서는 정적 메소드가 아닌 메소드도 사용 불가
정적 메소드에서 인스턴스
변수를 사용하려고 하면
컴파일러에서는 어떤 객체의
인스턴스 변수를 말하는지 알
수 없어 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 발생
정적변수(1/2)
클래스의어떤인스턴스에서든값이같음정적변수(1/2)
클래스의어떤인스턴스에서든값이같음
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 생성자가
실행됚
때마다
그
값읁
증가시킴
정적변수(2/2) 정적변수(2/2)
Duck
size
static duckCount
getSize()
setSize()
size: 20
static dC: 3
Duck 객체size: 22
static dC: 3
Duck 객체size: 12
static dC: 3
Duck 객체
각
Duck 객체마다
size
변수를
가지고
있지만
duckCount 는
정적
변수기
때문에
모든
Duck 객체가
복사본
단
하나를
공유
-인스턴스
변수
: 인스턴스마다
한
개씩
-정적
변수
: 클래스마다
한
개씩
정적 변수 초기화
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)
정적 변수 초기화
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)
static final (1/2)
static final 로선언된변수는상수이다. 절대변경불가static final (1/2)
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 로static final (2/2)
size 의값을변경할수없음정적변수가아닌변수를final로class Poof {
final void calcWhuffie() {
// 절대로오버로이드하면안되는// 중요한메소드}
}
메소드를final 로class Foof {
final int size = 3;
…
}
final class MyMostPerfectClass {
// 이클래스는확장할수없음}
class 를final 로static final (2/2)
size 의값을변경할수없음정적변수가아닌변수를final로class Poof {
final void calcWhuffie() {
// 절대로오버로이드하면안되는// 중요한메소드}
}
메소드를final 로
핵심정리(1/3)
정적
메소드는
객체
레퍼런스
변수
대신
클래스명읁
써서
호출
Math.random() vs. myFoo.go()
정적메소드는힙에그메소드가들어있는클래스의인스턴스가
없어도
호출핝
수
있다
.
특정인스턴스변수값에의존하지않는유틸리티메소드는정적
메소드로
만드는
것이
좋다
.
정적메소드에서는특정인스턴스와는연관되지않기때문에어떤
인스턴스
변수
값도
사용핝
수
없다
.
정적메소드에서는정적메소드가아닌메소드를사용할수없다.
핵심정리(2/3) 핵심정리(2/3)
정적
메소드만
들어있는
클래스가
있다면
그
클래스의
인스턴스를
만들
필요가
없기
때문에
생성자를
private 로
지정하는
것이
좋다
.
정적변수는해당클래스에속하는모든객체에서공유한다.
정적메소드에서도정적변수를사용할수있다.
자바에서상수를만들때는static과final 로지정하면된다.
final 로지정한정적변수는반드시초기화를해야한다.
상수의이름은모두대문자로붙인다.
핵심정리(3/3) 핵심정리(3/3)
final 로
지정한
변수
값은
값읁
한
번
대입하면
바꿀
수
없다
.
final 인스턴스변수값은선언할때또는생성자에서대입해야함.
final 메소드는오버라이드할수없다.
final 클래스는확장할수없다.
원시유형포장원시형식을객체처럼다루려면포장을하면된다.(java 5.0 이전)
원시유형포장원시형식을객체처럼다루려면포장을하면된다.(java 5.0 이전)
int x = 32;
ArrayList list = new ArrayList();
list.add(x);
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();
오토박싱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
listOfNumbers = new ArrayList();
listOfNumbers.add(3);
int num = listofNumbers.get(0);
}
오토박싱을쓰는경우오토박싱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 listOfNumbers = new ArrayList();
listOfNumbers.add(3);
int num = listofNumbers.get(0);
}
오토박싱을쓰는경우
오토박싱예(1/2) 오토박싱예(1/2)
메소드
인자
: 어떤
메소드에서
래퍼
유형읁
받아들인다면
, 래퍼에
대한
레퍼런스
,
또는
해당유형의원시값을인자로사용할수있다
.
void takeNumber(Integer) { }
리턴값
: 어떤
메소드에서
원시
유형읁
리턴
유형으로
선언한
경우에
그
유형과
호환되는
원시
값
또는
해당
유형의
래퍼에
대한
레퍼런스
가운데
아무거나
리턴해도
된다
.
int giveNumber() { return x; }
오토박싱 예 (2/2)
부울 표현식
: 부울 값이 들어갈 자리에는 부울값을 결과로 가지는 표현식이나 원시
부울 값 , Boolean 래퍼에 대한 레퍼런스 가운데 어떤 것이든 집어넣을
수 있다 .
if (bool) { System.out.println(“true”); }
수에 대한 연산
: 원시 유형이 들어갈 자리에 래퍼 유형을 피연산자로 사용할 수 있다 .
Integer i = new Integer(42); i++; // i =43
대입
: 어떤 원시 유형 , 또는 래퍼 유형으로 선언된 변수에 원시 값과 래퍼 중
어떤 것이든 마음대로 대입할 수 있다 .
래퍼 메소드
String s = “2”;
int x = Integer.parseInt(s);
double d = Double.parseDouble(“420.24”);
boolean b = new Boolean(“true”).booleanValue();
String 을 원시 값으로 변환
래퍼 메소드
String s = “2”;
int x = Integer.parseInt(s);
double d = Double.parseDouble(“420.24”);
boolean b = new Boolean(“true”).booleanValue();
String 을 원시 값으로 변환
parseBoolean() 같은
메소드가 있을 것 같지만
없고, 생성자를 써서
객체를 만든 다음
booleanValue() 로 원시
값을 변환할 수 있다 .
double d = 42.5;
String doubleString = “”+d;
double d = 42.5;
String doubleString = Double.toString(d);
원시 값을 String 으로 변환
String 에 어떤 값을 붙이든
그 값은 String 으로 바뀐다 .
Double 클래스에 들어있는
정적 메소드를 사용하는 방법