1 / 20

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

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();.

morley
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 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(); TestMath.java:3: Math() has private Access in java.lang.Math Math mathObject = new Math(); 1 error 다음과 같이 Math 클래스의 인스턴스를 만들면 … 오류 발생 Head First JAVA

  3. 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가리턴됨 Head First JAVA

  4. 정적 메소드(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 변수의 현재 값으로 지정된 곡이 재생 Head First JAVA

  5. 정적 메소드(2/4) 정적 메소드 Math public staticint min(int a, int b) { // a와 b 중에서 더 작은 것을 리턴 } Math.min(42, 36); // 36 리턴 min() max() abs() … 인스턴스 변수가 없기 때문에 메소드의 행동이 인스턴스 변수의 상태에 의해 전혀 달라지지 않는다. 레퍼런스변수명이 아닌 클래스명을 사용 Head First JAVA

  6. 정적 메소드(3/4) 정적 메소드에서는 정적 변수가 아닌 변수 사용 불가 public class Duck { private intsize; public static void main (String [] args) { System.out.println (“Size of duck is “ + size); } public voidsetSize(int s) { size = s; } public intgetSize() { return size; } } 정적 메소드에서인스턴스 변수를 사용하려고 하면 컴파일러에서는 어떤 객체의 인스턴스 변수를 말하는지 알 수 없어 error 발생 Head First JAVA

  7. 정적 메소드(4/4) 정적 메소드에서는 정적 메소드가 아닌 메소드도 사용 불가 public class Duck { private intsize; public static void main (String [] args) { System.out.println (“Size of duck is “getSize()); } public voidsetSize(int s) { size = s; } public intgetSize() { return size; } } 정적 메소드에서인스턴스 변수를 사용하려고 하면 컴파일러에서는 어떤 객체의 인스턴스 변수를 말하는지 알 수 없어 error 발생 getSize()에서는 size 인스턴스 변수를 사용해야 하기 대문에 getSize()를 호출하면 error 발생 Head First JAVA

  8. 정적 변수 (1/2) 클래스의 어떤 인스턴스에서든 값이 같음 public class Duck { private intsize; private staticintduckCount = 0; public Duck() { duckCount++; } public void setSize(int s) { size = s; } public intgetSize() { return size; } } 처음 로딩될 때만 초기화 매번 인스턴스가 만들어질 때마다 초기화되지 않음 duckCount가 정적변수라서 그 값이 0으로 재설정되지 않아 Duck 생성자가 실행될 때마다 그 값을 증가시킴 Head First JAVA

  9. 정적 변수 (2/2) 각 Duck 객체마다 size 변수를 가지고 있지만 duckCount는 정적 변수기 때문에 모든 Duck 객체가 복사본 단 하나를 공유 Duck size static duckCount Duck 객체 getSize() setSize() - 인스턴스 변수 : 인스턴스마다 한 개씩 - 정적 변수 : 클래스마다 한 개씩 size: 20 static dC: 3 size: 22 static dC: 3 size: 12 static dC: 3 Duck 객체 Duck 객체 Head First JAVA

  10. 정적 변수 초기화 class Player { staticintplayerCount = 0; private String name; public Player(String n) { name = n; playerCount++; } } public classPlayerTestDrive { 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

  11. static final (1/2) static final로 선언된 변수는 상수이다. 절대 변경 불가 선언할 때 초기화하는 방법 상수의변수명은 모두 대문자로 이루어진 이름을 붙인다 public class Foo { public static finalint FOO_X = 25; } 정적 초기화 부문에서 초기화 하는 방법 publicclass Bar { public static final double BAR_SIGN; static { BAR_SIGN = (double) Math.random(); } } 클래스가 로딩되면 어떤 정적 메소드(정적 변수)도 로딩되기 전에 이 코드가 실행됨 Head First JAVA

  12. static final (2/2) 정적 변수가 아닌 변수를 final로 size의 값을 변경할 수 없음 class Foof { final int size = 3; … } 메소드를final로 class Poof { final void calcWhuffie() { // 절대로 오버로이드 하면 안 되는 // 중요한 메소드 } } class를 final로 final class MyMostPerfectClass { // 이 클래스는 확장할 수 없음 } Head First JAVA

  13. 핵심정리 (1/3) 정적 메소드는 객체 레퍼런스 변수 대신 클래스명을 써서 호출 Math.random() vs. myFoo.go() 정적 메소드는힙에 그 메소드가 들어있는 클래스의 인스턴스가 없어도 호출할 수 있다. 특정 인스턴스 변수 값에 의존하지 않는 유틸리티 메소드는 정적 메소드로 만드는 것이 좋다. 정적 메소드에서는 특정 인스턴스와는 연관되지 않기 때문에 어떤 인스턴스 변수 값도 사용할 수 없다. 정적 메소드에서는 정적 메소드가 아닌 메소드를 사용할 수 없다. Head First JAVA

  14. 핵심정리 (2/3) 정적 메소드만 들어있는 클래스가 있다면 그 클래스의 인스턴스를 만들 필요가 없기 때문에 생성자를private로 지정하는 것이 좋다. 정적 변수는 해당 클래스에 속하는 모든 객체에서 공유한다. 정적 메소드에서도 정적 변수를 사용할 수 있다. 자바에서 상수를 만들 때는 static과 final로 지정하면 된다. final로 지정한 정적 변수는 반드시 초기화를 해야 한다. 상수의 이름은 모두 대문자로 붙인다. Head First JAVA

  15. 핵심정리 (3/3) final 인스턴스 변수 값은 선언할 때 또는 생성자에서 대입해야 함. final 메소드는오버라이드할 수 없다. final 클래스는 확장할 수 없다. final로 지정한 변수 값은 값을 한 번 대입하면 바꿀 수 없다. Head First JAVA

  16. 원시유형 포장 원시 형식을 객체처럼 다루려면 포장을 하면 된다.(java 5.0 이전) 5.0 이전 버전에서는 작동하지 않는다 ArrayList의 add() 메소드에서 원시 값이 아닌 객체 레퍼런스만은 인자로 받아들이기 때문 int x = 32; ArrayList list = new ArrayList(); list.add(x); 값을 포장하는 방법 Boolean Character Byte Short Integer Long Float Double inti = 288; Integer iWrap = new Integer(i); 원시 값을 래퍼생성자에 전달하기만 하면 된다. 포장을 벗겨 값을 구하는 방법 intunWrapped = iWrap.intValue(); Boolean : booleanValue(); Character : charValue(); Head First JAVA

  17. 오토박싱 오토박싱을 쓰지 않는 경우 public void doNumOldWay() { ArrayListlistOfNumbers = new ArrayList(); listOfNumbers.add(New Integer(3)); Integer one = (Integer) listOfNumbers.get(0); intintOne = one.intValue(); } 오토박싱을 쓰는 경우 public void doNumNewWay() { ArrayList<Integer>listOfNumbers = new ArrayList<Integer>(); listOfNumbers.add(3); int num = listofNumbers.get(0); } Head First JAVA

  18. 오토박싱예 (1/2) 메소드 인자 : 어떤 메소드에서래퍼 유형을 받아들인다면, 래퍼에 대한 레퍼런스, 또는 해당 유형의 원시 값을 인자로 사용할 수 있다. void takeNumber(Integer) { } 리턴 값 : 어떤 메소드에서 원시 유형을 리턴 유형으로 선언한 경우에 그 유형과 호환되는 원시 값 또는 해당 유형의 래퍼에 대한 레퍼런스 가운데 아무거나 리턴해도 된다. intgiveNumber() { return x; } Head First JAVA

  19. 오토박싱예 (2/2) 부울표현식 : 부울 값이 들어갈 자리에는 부울값을 결과로 가지는 표현식이나 원시 부울 값, Boolean 래퍼에 대한 레퍼런스 가운데 어떤 것이든 집어넣을 수 있다. if (bool) { System.out.println(“true”); } 수에대한 연산 : 원시유형이 들어갈 자리에 래퍼 유형을 피연산자로 사용할 수 있다. Integer i = new Integer(42); i++; // i =43 대입 : 어떤 원시 유형, 또는 래퍼 유형으로 선언된 변수에 원시 값과 래퍼 중 어떤 것이든 마음대로 대입할 수 있다. Head First JAVA

  20. 래퍼메소드 String을 원시 값으로 변환 parseBoolean() 같은 메소드가 있을 것 같지만없고, 생성자를 써서 객체를 만든 다음 booleanValue()로 원시 값을 변환할 수 있다. 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에 어떤 값을 붙이든 그 값은 String으로 바뀐다. Double 클래스에 들어있는 정적 메소드를 사용하는 방법 Head First JAVA

More Related