(static, wrapper, final, formatting, importstatic) 내맘대로 Head First Java 정리 8

Math 메서드는 거의 전역 메서드이다=> 자바에서는 전역이라고 이름 붙여진 것이 전혀 없기 때문에 「거의」 전역 메서드라고 할 수 있다.=> 이러한 메서드는 인스턴스 변수의 값에 의존하지 않는다=> 즉 이러한 메서드에서는 인스턴스 변수를 전혀 사용하지 않는다.=> 인스턴스 변수를 전혀 사용하지 않기 때문에 객체마다 행동이 달라질 수 없다.=> 이러한 메소드를 ‘정적’ 메소드라고 한다.

static이라는 키워드를 사용하면 클래스의 인스턴스 없이 메소드를 실행할 수 있다.= 즉, 정적 메서드는 “인스턴스 변수에 따라 행동이 달라지지 않기 때문에 인스턴스나 객체가 불필요하고 클래스만으로도 좋다”는 것을 의미한다.=> 정적 메서드를 호출할 때는 클래스 이름을 사용한다 ex)Math.min(88,86); => 일반 메서드를 호출할 때는 레퍼런스 변수 이름을 사용한다 ex) Songt2=newSong( ); t2.play( );

메서드를 private로 지정하면 해당 메서드는 같은 클래스 내에 있는 코드로만 호출할 수 있다.=> 즉 생성자를 private로 지정하면 마찬가지로 클래스 밖에서는 아무도 “new”하여 객체를 생성 할 수 없다.=> Math 클래스에서도 이러한 방법을 사용한다.

한 클래스에 정적 메서드와 정적 메서드가 아닌 메서드를 자유롭게 섞어 사용해도 된다.=>그러나 정적 메소드가 아닌 메소드가 하나라도 있다면 그 클래스의 인스턴스를 만드는 방법이 반드시 있어야 한다=>새로운 객체를 구하는 방법은 new를 사용하는 방법, 역직렬화(deserializtion)를 이용하는 방법, 자바리플렉션 API라는 방법이 3가지가 있다.

정적 메서드에서는 정적 변수가 아닌 변수(인스턴스 변수)를 사용할 수 없다.= 정적 메서드는 레퍼런스가 아닌 클래스에 대해 호출되기 때문에 정적 메서드에서 해당 클래스에 있는 인스턴스 변수도 참조할 수 없다= 정적 메서드에서 어떤 인스턴스에 있는 변수를 사용하는지를 알 수 있는 방법이 없는 것이다.

정적 메서드에서는 정적 메서드가 아닌 메서드도 사용할 수 없다.=> 정적 메서드가 아닌 메서드는 보통 인스턴스 변수(상태)에 따라 행동이 달라진다=> 즉 static 메서드 내에 일반 메서드가 들어갈 경우 일반 메서드에서 사용하는 인스턴스 변수를 볼 수 없어 사용할 수 없다.=> 인스턴스 변수를 사용하지 않는 메서드의 경우에도 인스턴스 변수를 사용할 가능성은 남아 있어 사용할 수 없음

정적 변수는 클래스의 어느 인스턴스에서나 값이 같다=>정적 변수는 한 클래스의 모든 인스턴스에서 공유한다=>즉 인스턴스마다 하나씩 있는 것이 아니라 클래스마다 하나씩 있다.

=>인스턴스 변수=인스턴스마다 1개씩=>정적 변수=반마다 1개씩

정적 변수 초기화와 관련해서 다음과 같은 2개의 규칙이 있다.=>1. 정적 변수는 그 반에 속하는 오브젝트를 생성하기 전에 초기화된다=>즉 등급에 들어 있는 모든 정적 변수는 그 반의 객체가 처음 만들기 전에 초기화된다.=>2. 정적 변수는 그 반에 속하는 정적 메서드가 실행되기 전에 초기화된다.

staticfinal로 선언된 변수는 정수이다=>final에서 지정한 변수는 초기화되면 절대로 그 값을 바꿀 수 없다.=>즉 staticfinal로 선언한 변수는 클래스가 로드되는 동안 계속 같은 값을 유지한다.=>staticfinal이 상수에 지정하는 유일한 방법이지만 정수임을 쉽게 알 수 있도록 정수 변수 이름은 모두 대문자로 쓴다

final로 지정된 정적 변수를 초기화하는 방법=>1.publicclassFoo{publicstaticfinalintFOO_X=25;}=상수를 직접 바로 초기화하는 방법=>2.publicclassBar{publicstaticfinaldoubleBAR_SIGN;static{BAR_SIGN=(double)Math.random();}=상수를 선언하고 static에 초기화하는 방법

**스택이 붙은 것을 스택과 힙이 아니라 Data이라는 영역에 보존되지만 알기 쉽게 static영역에 배정될 것은 모든 객체가 공유하지만, 나방 베, 수집가의 관리 땅 밖이어서 static을 남발한다고 성능에 악영향을 미친다.

final은 정적 변수에 대해서만 사용할 수 있는 키워드가 아니라=>변수를 final로 지정하면 그 값을 바꿀 수 없다=>메소드를 final로 지정하면 해당 메서드가 오버 라이드 할 수 없다=>반을 final로 지정하면 해당 클래스는 확장할 수 없다.=>즉 하위 클래스를 만드는 것이 불가능하다

반을 final로 지정하면 객체 지향의 의미가 바래지지 않을래?=보통 반을 final로 지정하는 이유는 보안 문제 때문이다=예를 들어 String클래스 같은 것을 확장하고 다 형적으로 String하위 클래스 객체를 사용할 수 없도록 하는 것이다.

클래스를 이미 final로 지정하면 메서드는 굳이 final로 지정하지 않아도 된다=>어차피 확장 불가능해서 오버 라이드 수 없기 때문이다.=>그러나 한메소드는 오버 라이드 할 수 있도록 한 방법은 못하게 할 때는 메서드에 final를 내는 것이다.

Math메서드=>Math.random()=0.0이상 1.0미만의 double값을 복귀=>Math.abs()= 주어진 인자의 절대 값을 나타내는 값을 복귀=>Math.round() 주어진 수를 반올림하고 가장 가까운 int또는 long을 복귀=>Math.min()=두 인자 중보다 작은 값을 복귀=>Math.max()=두 인자 중보다 큰 값을 복귀

대대로 원시 타입도 객체처럼 취급해야 할 때도 있다=> 모든 원시 타입에 래퍼(wrapper)가 있지만 래퍼는 모두 java. lang 패키지에서 import를 사용하지 않고도 사용할 수 있다.=>모든 원시 타입에 이름을 붙여서 쉽게 파악할 수 있지만 클래스이므로 앞글자는 대문자다=>char=character이고, int=Integer로 바뀌는 것 외에는 모든 원시 타입과 래퍼 클래스가 같다=래퍼는 래퍼 형식에 해당하는 원시 형식의 인스턴스 변수가 들어있는 객체이다.

래퍼에서 값을 포장할 때는 inti=288; Integeri Wrap=new Integer(i);로 사용한다.포장을 벗기고 값을 구할 때는 intunWrapped=iWrap.intValue( );를 사용하여 포장을 벗긴다.

자바 5.0 이전까지는 원시 변수와 객체 레퍼런스가 엄격히 구분돼 있어 절대 서로 교환해 사용할 수 없었다.=> 그러나 5.0부터 오토복싱 기능으로 원시값과 래퍼 객체 간의 변환을 자동으로 처리해줬다.=> 그래서 ArrayList에 add할 때 그냥 숫자 3을 입력해도 오토복싱 기능에 따라 자동으로 싸서 값을 넣어줬다.=오토복싱은 거의 항상 원시타입이 들어가는 곳에 그 유형에 해당하는 래퍼 객체를 넣거나 반대로 원시값을 넣을 수 있게 해준다.=> 그러므로 값을 대입할 때도 IntegeriWrap=3;으로 사용할 수 있는 것이다.

래퍼에는 다양한 유용한 정적 메소드가 들어 있다.=>대표적으로 퍼싱 메서드이지만 String을 인자로 받아 그에 해당하는 원시 유형을 리턴하는 =ex) Strings=”2″;intx=Integer.parseInt(s);반대로 원시 숫자를 String으로 변환하는 방법은 두 가지가 있다.=>1.+연산자를 사용하여 String을 붙일 것=>ex)doubled=42.5;StringdoubleString=”+d;=”2. toString 메서드 사용법=>ex)doubled=42.5;StringdoubleString=Double. to String(d);

포맷=> 포맷은 원하는 형식으로 바꾸는 것을 의미한다=> 포맷할 숫자와 포맷 방법을 인자에게 넘기면서 String.format( ) 정적 메서드를 호출할 뿐이다.

숫자를 표기할 때 쉼표를 사용해 포맷하는 방법=>String.format(“%,d”,10000000);=>앞 인자는 지시사항에서 두 번째 인자를 십진정수로 표시하고 쉼표를 눌러달라는 뜻이다.=>%는 ‘인자가 들어가는 장소’를 의미하고, 이후에는 표현 방법을 나타내는 것이 들어간다=>% 뒤에 들어가는 부분에는 특별한 규칙이 있으며 포맷된 String의 특정 지점에 삽입되는 인자를 포맷하는 방법을 지시하는 역할을 한다.

%[인자 번호] [플래그] [폭] [정확도] 유형으로 구분되는 => 유형은 필수이고 나머지 대괄호로 구성된 것은 선택이다 => 유형을 살펴보면 %d = 십진정수, %f = 부동소수점, %x = 16진수, %c = 글자다.=> 만약 인자가 2개 이상 있으면 format() 메서드에 인자가 전달되는 순서대로 포맷 지시자에 변수를 삽입하면 된다.

날짜를 포맷하는 방법 => %tc = 날짜와 시간을 모두 표시할 때 = > %tr = 시간만 표시할 때 = > %tA, %tB, %td = 순으로 요일, 월, 일 표시 시

정적 임포트(static import)=> 타이핑을 싫어하는 사람은 매우 좋은 기능이지만 가장 큰 단점은 코드를 읽기 어려워질 수 있다.=기본 개념은 정적 클래스, 정적 변수, enum 값 등을 사용할 때 정적 Import를 활용하여 타이핑을 더 적게 하자는 것이다=ex) importstatic java.lang.Math.*;라고 선언하면 random( )처럼 메서드만 쓰고 사용할 수 있다.

error: Content is protected !!