10. 숫자와정적변수, 정적메소드 학습목표 정적메소드와정적변수상수래퍼클래스포매팅
숫자는정말중요합니다 Math 클래스 출력방식조절 String 을수로변환하는방법 수를 String 으로변환하는방법 정적메소드 정적변수 상수 (static final)
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
일반메소드와정적메소드 일반메소드 public class Song { String title; public Song(String t) { title = t; public void play() { SoundPlayer player = new SoundPlayer(); player.playsound(title); t2 Song t2.play(); 말해줄께조규찬 Song 객체 s3 Song s3.play(); Song String title play() 보고싶다김범수 Song 객체
일반메소드와정적메소드 정적메소드 (static method) public static int min(int a, int b) { // a 와 b 중에서더작은것을리턴 Math min() max() abs() Math.min(42, 36); 정적메소드를호출할때는클래스명을, 정적메소드가아닌메소드를호출할때는레퍼런스변수명을사용 객체가없다!!
인스턴스를만들수없는메소드 추상클래스 생성자를 private 으로지정한클래스 정적메소드만들어있는클래스는생성자를 private 으로지정하여인스턴스를만들수없도록하는것이좋습니다. 정적메소드가있다고해서무조건인스턴스를만들수없도록하진않습니다.
정적메소드와인스턴스변수 정적메소드에서는인스턴스변수를쓸수없음 정적변수만써야함 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); ^
정적메소드에서의메소드호출 정적메소드에서는정적메소드만호출할수있습니다. 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; % 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()); ^
바보같은질문은없습니다. 클래스명이아니라레퍼런스변수명을써서정적메소드를호출하는건어떻게된건가요? 그렇게하는것도가능합니다. 하지만그런다고해서그메소드가인스턴스메소드인것은아닙니다. Duck d = new Duck(); String[] s = {; d.main(s);
정적변수 정적변수 (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;
정적변수 정적변수는공유됨 같은클래스에속하는모든인스턴스에서정적변수의하나뿐인복사본을공유함 인스턴스변수 인스턴스마다하나씩 정적변수 클래스마다하나씩
정적변수초기화 초기화시기 클래스가로딩될때 두가지규칙 객체가생성되기전에초기화됨 정적메소드가실행되기전에초기화됨 % java PlayerTestDrive 0 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 ); System.out.println(Player.playerCount);
상수 static final 변수 == 상수 public static final double PI = 3.141592653589793; 상수변수명은모두대문자로씀 정적초기화부분 (static initializer) class Foo { final static int x; static { x = 42;
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(); % javac Bar.java Bar.java:1: variable BAR_SIGN might not have been initialized 1 error
final 키워드 변수를 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 {
바보같은질문은없습니다 클래스를 final 로지정하는경우는? 보안문제때문에이렇게하는경우가종종있습니다. String 같은클래스를누군가가확장해서 String 객체가들어갈자리에다형성을이용해서하위클래스를집어넣으면보안에심각한구멍이생길수도있습니다. 어떤클래스의특정메소드를반드시있는그대로써야한다면클래스를 final 로지정해서확장할수없도록하면됩니다.
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(90876.5, 90876.49); Math.max()
래퍼 (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();
오토박싱과원시 / 객체유형 자바 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);
오토박싱이작동하는경우 메소드인자 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;
래퍼클래스의정적유틸리티메소드 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);
원시숫자를 String으로바꾸는방법 String 의 + 연산자를활용하는방법 double d = 42.5; String doublestring = + d; 유틸리티메소드를사용하는방법 double d = 42.5; String doublestring = Double.toString(d);
숫자포매팅 자바에서는숫자포매팅기능과입출력기능이분리되어있습니다. 포매팅방법 1. 포매터를만듭니다. 2. 포매팅시킵니다. public class TestFormats { public static void main(string[] args) { String s = String.format( %,d, 1000000000); System.out.println(s); 1,000,000,000
숫자포매팅 format( I have %.2f bugs to fix., 476578.09876); I have 476578.10 bugs to fix. format( I have %,.2f bugs to fix., 476578.09876); I have 476,578.10 bugs to fix. %[ 인자번호 ][ 플래그 ][ 너비 ][. 정밀도 ] 유형 format( %,6.1f, 42.000); 유형지시자 %d 십진수 %f 부동소수점수 %x 16진수 %c 문자
날짜포매팅 String.format( %tc, new Date()); 날짜, 시각모두 Sun Nov 28 14:52:41 MST 2004 String.format( %tr, new Date()); 시각만 03:01:47 PM Date today = new Date(); 요일, 월, 일 String.format(%tA, %tb, %td, today, today, today); Sunday, November 28 String.format(%tA, %<tb, %<td, today); today 를한번만인자로전달하면됨
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();
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));
숙제 본문을꼼꼼하게읽어봅시다. 연필을깎으며, 두뇌운동및 10 장끝에있는연습문제를모두각자의힘으로해결해봅시다. 포매팅관련코드들을실행시켜보면서어떤결과가나오는지확인해보고, 조금씩고쳐가면서포매팅연습을해봅시다. API 문서를살펴보면서또어떤다른메소드들이있는지확인해봅시다.