Presentation is loading. Please wait.

Presentation is loading. Please wait.

정적 메소드와 정적 변수 상수 래퍼 클래스 포매팅

Similar presentations


Presentation on theme: "정적 메소드와 정적 변수 상수 래퍼 클래스 포매팅"— Presentation transcript:

1 정적 메소드와 정적 변수 상수 래퍼 클래스 포매팅
10. 숫자와 정적 변수, 정적 메소드 정적 메소드와 정적 변수 상수 래퍼 클래스 포매팅

2 숫자는 정말 중요합니다 Math 클래스 출력 방식 조절 String을 수로 변환하는 방법 수를 String으로 변환하는 방법
정적 메소드 정적 변수 상수 (static final)

3 Math 메소드 ‘거의’ 전역 메소드(global method) 인스턴스 변수를 전혀 사용하지 않음 인스턴스를 만들 수 없음
Math mathObject = new Math(); int x = Math.round(42.2); int y = Math.min(56, 12); int z = Math.abs(-343); % javac TestMath.java TestMath.java:3:Math() has private access in java.lang.Math Math mathObject = new Math(); ^ 1 error

4 일반 메소드와 정적 메소드 일반 메소드 Song 객체 Song 객체 Song Song 보고싶다 말해줄께 김범수 조규찬 s3
String title play() public class Song { String title; public Song(String t) { title = t; } public void play() { SoundPlayer player = new SoundPlayer(); player.playSound(title); 보고싶다 김범수 말해줄께 조규찬 Song 객체 Song 객체 s3 t2 Song Song s3.play(); t2.play();

5 일반 메소드와 정적 메소드 정적 메소드 (static method) 객체가 없다!!
Math min() max() abs() public static int min(int a, int b) { // a와 b 중에서 더 작은 것을 리턴 } Math.min(42, 36); 정적 메소드를 호출할 때는 클래스명을, 정적 메소드가 아닌 메소드를 호출할 때는 레퍼런스 변수명을 사용 객체가 없다!!

6 인스턴스를 만들 수 없는 메소드 추상 클래스 생성자를 private으로 지정한 클래스
정적 메소드가 있다고 해서 무조건 인스턴스를 만들 수 없도록 하진 않습니다.

7 정적 메소드와 인스턴스 변수 정적 메소드에서는 인스턴스 변수를 쓸 수 없음 정적 변수만 써야 함
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; % javac Duck.java Duck.java:4: non-static variable size cannot be referenced from a static context System.out.println(“Size of duck is “ + size); ^

8 정적 메소드에서의 메소드 호출 정적 메소드에서는 정적 메소드만 호출할 수 있습니다. 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; 정적 메소드에서 인스턴스 변수를 전혀 사용하지 않는 정적 메소드가 아닌 메소드를 호출하는 경우는 괜찮지 않을까요? A: 아닙니다. 인스턴스 변수를 쓸 가능성은 여전히 있기 때문에 컴파일러에서는 이런 코드를 허용하지 않습니다. 예를 들어 처음에는 인스턴스 변수를 쓰지 않았지만 나중에 그 메소드를 오버라이드해서 인스턴스 변수를 쓰게 된다면 이상한 일이 일어나겠죠? % javac Duck.java Duck.java:4: non-static method getSize() cannot be referenced from a static context System.out.println(“Size of duck is “ + getSize()); ^

9 바보 같은 질문은 없습니다. 클래스명이 아니라 레퍼런스 변수명을 써서 정적 메소드를 호출하는 건 어떻게 된 건가요?
그렇게 하는 것도 가능합니다. 하지만 그런다고 해서 그 메소드가 인스턴스 메소드인 것은 아닙니다. Duck d = new Duck(); String[] s = {}; d.main(s); 정적 메소드에서는 인스턴스 변수 상태를 볼 수 없습니다.

10 정적 변수 (static variable)
어떤 인스턴스에서도 값이 똑같은 변수 class Duck { int duckCount = 0; public Duck() { duckCount++; } 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;

11 정적 변수 정적 변수는 공유됨 같은 클래스에 속하는 모든 인스턴스에서 정적 변수의 하나뿐인 복사본을 공유함 인스턴스 변수
인스턴스마다 하나씩 정적 변수 클래스마다 하나씩

12 정적 변수 초기화 초기화 시기 두 가지 규칙 클래스가 로딩될 때 객체가 생성되기 전에 초기화됨
정적 메소드가 실행되기 전에 초기화됨 % java PlayerTestDrive 1 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”); }

13 상수 static final 변수 == 상수 상수 변수명은 모두 대문자로 씀
public static final double PI = ; 상수 변수명은 모두 대문자로 씀 정적 초기화 부분(static initializer) class Foo { final static int x; static { x = 42; } Math.PI

14 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(); …. 만약 static final 변수를 초기화하지 않으면 어떤 일이 일어날까요? (빨간 줄 나오게 클릭) 이렇게 처음에 값을 정해주지도 않고 정적 초기화부분도 만들지 않는다면 어떻게 될까요? 일반 지역변수나 인스턴스 변수는 값을 지정하지 않으면 자동으로 정수형은 0, 부동소수점 소수형은 0.0, 부울형은 false, 객체 레퍼런스는 null 같은 초기값이 지정이 되지만 static final 변수는 자동으로 초기값이 대입되지 않습니다. %%클릭%% 따라서 이런 코드를 컴파일하면 초기화되지 않았을 수 있다는 컴파일 오류가 납니다. % javac Bar.java Bar.java:1: variable BAR_SIGN might not have been initialized 1 error

15 final 키워드 변수를 final로 지정하면 그 값을 바꿀 수 없음 메소드를 final로 지정하면 오버라이드할 수 없음
class Foof { final int size = 3; final int whuffie; Foof() { whuffie = 42; } void doStuff(final int x) { void doMore() { final int z = 7; class Poof { final void calcWhuffie() { } final class MyMostPerfectClass { }

16 바보 같은 질문은 없습니다 클래스를 final로 지정하는 경우는?
보안 문제 때문에 이렇게 하는 경우가 종종 있습니다. String 같은 클래스를 누군가가 확장해서 String 객체가 들어갈 자리에 다형성을 이용해서 하위클래스를 집어넣으면 보안에 심각한 구멍이 생길 수도 있습니다. 어떤 클래스의 특정 메소드를 반드시 있는 그대로 써야 한다면 클래스를 final로 지정해서 확장할 수 없도록 하면 됩니다.

17 API에서 다른 Math 메소드도 찾아봅시다.
Math.random() 0.0 이상 1.0 미만의 double 값 리턴 double r1 = Math.random(); int r2 = (int) (Math.random() * 5); Math.abs() 절대값을 리턴 int x = Math.abs(-240); double d = Maht.abs(240.45); Math.round() 반올림하여 int 또는 long을 리턴 int x = Math.round(-24.8f); int y = Math.round(24.45f); Math.min() 두 인자 중 더 작은 값 리턴 int x = Math.min(24, 490); double y = Math.min( , ); Math.max() API에서 다른 Math 메소드도 찾아봅시다.

18 래퍼(wrapper) 클래스 래퍼 클래스 각 원시 유형에 해당하는 객체 Boolean Character Byte Short
Integer Long Float Double int x = 32; ArrayList list = new ArrayList(); list.add(x); int i = 288; Integer iWrap = new Integer(i); int unWrapped = iWrap.intValue();

19 오토박싱과 원시/객체유형 자바 5.0 이전 자바 5.0 이후 (오토박싱을 쓰는 경우)
public void doNumsOldWay() { ArrayList listOfNumbers = new ArrayList(); listOfNumbers.add(new Integer(3)); Integer one = (Integer) listOfNumbers.get(0); int intOne = one.intValue(); } 자바 5.0 이후 (오토박싱을 쓰는 경우) 원시유형 ↔ 래퍼 객체 변환을 자동으로 처리 public void doNumsNewWay() { ArrayList<Integer> listOfNumbers = new ArrayList<Integer>(); listOfNumbers.add(3); int num = listOfNumbers.get(0);

20 오토박싱이 작동하는 경우 메소드 인자 리턴값 부울 표현식 수에 대한 연산 대입
void takeNumber(Integer i) { } 리턴값 int giveNumber() { return x; } 부울 표현식 if (bool) { System.out.println(“true”); 수에 대한 연산 Integer j = new Integer(5); Integer k = j + 3; 대입 Double d = x;

21 String을 원시 값으로 바꾸는 방법 래퍼 클래스의 정적 유틸리티 메소드 String s = “2”;
int x = Integer.parseInt(s); double d = Double.parseDouble(“420.24”); boolean b = new Boolean(“true”).booleanValue(); String t = “two”; int y = Integer.parseInt(t);

22 원시 숫자를 String으로 바꾸는 방법 String의 + 연산자를 활용하는 방법 유틸리티 메소드를 사용하는 방법
double d = 42.5; String doubleString = “” + d; 유틸리티 메소드를 사용하는 방법 String doubleString = Double.toString(d);

23 숫자 포매팅 자바에서는 숫자 포매팅 기능과 입출력 기능이 분리되어있습니다. 포매팅 방법 예제를 직접 실행시켜봅시다.
포매터를 만듭니다. 포매팅시킵니다. 예제를 직접 실행시켜봅시다. public class TestFormats { public static void main(String[] args) { String s = String.format(“%,d”, ); System.out.println(s); } 1,000,000,000

24 숫자 포매팅 format(“I have %.2f bugs to fix.”, 476578.09876);
%[인자 번호][플래그][너비][.정밀도]유형 format(“%,6.1f”, ); I have bugs to fix. I have 476, bugs to fix. 유형 지시자 %d 십진수 %f 부동소수점수 %x 16진수 %c 문자

25 날짜 포매팅 String.format(“%tc”, new Date()); 날짜, 시각 모두
String.format(“%tr”, new Date()); 시각만 Date today = new Date(); 요일, 월, 일 String.format(%tA, %tB, %td”, today, today, today); String.format(%tA, %<tB, %<td”, today); today를 한 번만 인자로 전달하면 됨 Sun Nov 28 14:52:41 MST 2004 03:01:47 PM Sunday, November 28

26 java.util.Calendar java.util.Date보다는 java.util.Calendar를 써야 함
표준 API에서는 대부분 java.util.GregorianCalendar를 사용 현재 시각에 대한 타임스탬프용으로는 계속 java.util.Date를 써도 됨 Calendar 객체 생성법 Calendar cal = new Calendar(); 에러!!! Calendar cal = Calendar.getInstance(); API 문서에서 java.util.Calendar 부분을 찾아봅시다.

27 import static 구문 자바 5.0에서 새로 추가된 문법
정적 클래스나 정적 변수, 열거형(enum)을 쓸 때 import static 구문을 쓸 수 있음 코드를 읽기가 힘들어질 수 있으므로 주의!! import static java.lang.System.out; import static java.lang.Math.*; class WithStatic { public static void main(String [] args) { out.println(“sqrt “ + sqrt(2.0)); out.println(“tan “ + tan(60)); }

28 숙제 본문을 꼼꼼하게 읽어봅시다. 연필을 깎으며, 두뇌 운동 및 10장 끝에 있는 연습문제를 모두 각자의 힘으로 해결해봅시다.
포매팅 관련 코드들을 실행시켜보면서 어떤 결과가 나오는지 확인해보고, 조금씩 고쳐가면서 포매팅 연습을 해 봅시다. API 문서를 살펴보면서 또 어떤 다른 메소드들이 있는지 확인해 봅시다.


Download ppt "정적 메소드와 정적 변수 상수 래퍼 클래스 포매팅"

Similar presentations


Ads by Google