JAVA 독학 3 강 제 3 장 표현 및 흐름 제어 ■ Objective ▶ instance 와 local variable 의 차이점 ▶ instance variable 의 초기 화 과정 ▶ logical operator ▶ Casting ▶ if / else , switch / case , while , Variable and ScopeLocal variable - method 안 에 선언 되 어 지 는 variable ; local , automatic , temporary variable 이 라고 한다 . - method 가 실행 될 때 , 생성 되 었 다가 method 의 실행 이 끝나 면 없 어 진다 . - 사용 되 어 지 기 전 에 반드시 initialize 되 어 져야 한다 . instance - method 밖 에 정의 되 어 진다 . 그리고 , object 가 생성 될 때 ( new Xxxx ( ) ) , object 가 더 이상 참조 하 지 않 을 때 , garbage collect 됨 - Local variable 과 는 다르 게 객체 의 멤버 변수 이 기 때문 에 자동 적 으로 값 을 초기 화 한다 . static variable - static variable 의 경우 객체 가 생 성 이 되 어도 static 으로 선언 되 어 진 변수 는 하나 만 생 성 되게 된다 - 메모리 . - static 으로 선언 된 method 의 경우 도 class 의 individual instance 로 고려 되 어 지 지 않 는다 . - static 으로 선언 되 어 진 method 는 static 으로 선언 되 지 않 은 것 을 바로 사용 할 수 없 기 때문 에 반드시 instance 를 생성 해서 사용 하 여야 한다 . - static method 안 에 는 this 를 사용 할 수 없 다 . - static 으로 선언 되 어 진 variable 과 method 는 클 래스 에 속하 기 때문 에 object 의 instance 생 성 없이 사용 할 수 있 다 . - static method 는 non - static method 에 overridden 되 어 질 수 없 다 . 다음 과 같이 요약 할 수 있 다 . ‥ static method 는 static data 만 access 할 수 있 다 . ‥ static method 는 class 의 static method 만 을 call 할 수 있 다 . ‥ static method 는 this 를 가질 수 없 다 . ‥ static method 는 non - static 으로 overridden 되 어 질 수 없 다 . Variable Initializationinstance variable 은 object 가 생성 될 때 , 다음 과 같이 자동 적 으로 초기 화 되 어 진다 . byte : 0 short : 0 char : "\ u 0000 " int : 0 long : 0 Lfloat : 0 . 0 Fdouble 0 . 0 D ( 0 . 0 ) boolean : falseString : null Object : null 예제 시작 class TestVar { int x 1 ; short x 2 ; byte x 3 ; char c ; long L ; float f ; String s ; boolean b ; double d ; void testVariable ( ) { System . out . println ( " byte =" + x 3 ) ; System . out . println ( " short =" + x 2 ) ; System . out . println ( " char =" + c ) ; System . out . println ( " int =" + x 1 ) ; System . out . println ( " long =" + L ) ; System . out . println ( " float =" + f ) ; System . out . println ( " double =" + d ) ; System . out . println ( " boolean =" + b ) ; System . out . println ( " String =" + s ) ;} public static void main ( String args [ ] ) { TestVar tv = new TestVar ( ) ; tv . testVariable ( ) ;}} 실행 결과 byte = 0 short = 0 char = '\ u 0000 ' : NULLint = 0 long = 0 float = 0 double = 0 . 0 boolean = falseString = null 예 ) class So { void me 1 ( ) { System . out . println ( " HHHH ");}} public class Hi { static int i ; static So s = new So ( ) ; public static void main ( String args [ ] ) { System . out . println ( "!!!!!!!!!!!!!!!"+ i ) ; Hi . s . me 1 ( ) ; / / System . out . println ( ) ;}} Operatorjava 에서 는 아래 의 표 와 같 은 operator 를 제공 한다 . Separator . [ ] {} ; , R to L ++ -- + - ~ ! ( cast _ operator ) L to R * / % L to R + - L to R << >> >>> L to R < > <= >= instanceofL to R == ! = L to R & L to R ^ L to R | L to R && L to R || R to L ? : R to L = *= / = %= += -= <<= >>= >>>= &= ^= |= bitwise , boolean 연산자 ~ integralbitwise complement ( 보수 ) ! booleanboolean NOT & booleanboolean ANDintegralbitwise AND | booleanboolean ORintegralbitwise OR ^ booleanboolean XORintegralbitwise XOR && booleanconditional AND || booleanconditional OR 두 operand ( 피연산자 ) 는 반드시 compatible type 이 어야 한다 . 유의 ) boolean 에서 다른 type 으로 , 다른 type 에서 boolean 으로 casting 을 허용 하 지 않 기 때문 에 둘 중 에 하나 가 boolean 이 라면 양쪽 다 boolean 이 어야 한다 . short circuit logical operator ( 두 개 짜리 ) : AND 와 OR 에 대해서 && 와 ||&& 와 || 의 경우 에 는 결과 가 확실 하 게 미리 알 수 있 다면 , 더 이상 연산 을 수행 하 지 않 는다 . AND 연산 에 대해서 , 한쪽 의 operand 가 false 이 면 , 그 결과 는 다른 operand 의 값 에 상관없이 false 이 다 . OR 연산 의 경우 한 operand 가 true 이 면 , 그 결과 는 다른 operand 의 값 에 상관없이 true 이 다 . 아래 의 식 을 보 면 쉽 게 이해 할 수 가 있 다 . 예 제 1 예제 2 if ( s ! = null ) { if ( s . length ( ) > 20 ) { System . out . println ( s ) ;}} if ( ( s ! = null ) && ( s . length ( ) > 20 ) ) { System . out . println ( s ) ;} 예 제 1 은 예제 2 로 쉽 게 바꿀 수 있 다 . 예 제 2 에서 s 가 null 이 면 , s . length ( ) 에서 는 NullPointerException 을 발생 한다 . 그러나 그러 한 상황 은 발생 하 지 않 는다 . 두 번 째 예제 에서 ( s ! = null ) 이 false 이 면 전체 식 의 결과 값 이 ( s . length ( ) > 20 ) 에 상관없이 false 이 기 때문 에 두 번 째 식 은 피해 가 게 된다 . ( && 두 개 짜리 의 장점 이 죠 ) '+' operator - primitive type 뿐 아니 라 , object 인 String 에 도 적용 할 수 있 다 '+' 의 연산자 중 하나 가 String 이 면 , 그 결과 는 String 이 된다 . 요약 ‥ '+' 의 operand 가 다 primitive type 일 때 , … 결과 는 primitive type . … 두 operand 중 더 범위 가 넓 은 쪽 의 type 이 된다 . ( 자동 promotion ) … 먼저 operand 대해서 더 범위 가 넓 은 쪽 으로 promotion 이 된 후 에 계산 이 이루어지 기 때문 에 결과 값 은 overflow 되 거나 정밀 하 게 나타낼 때 loss 가 발생 할 수 있 다 . ‥ primitive type 이 아닌 임의 의 operand 일 때 , … 한쪽 이 반드시 String 이 어야 한다 . 그렇 지 않 으면 illegal 이 다 . … 한 operand 가 String 이 아니 라면 , String 이 아닌 operand 는 String 으로 변환 된 후 에 계산 된다 . java 에서 의 shift 연산자 는 다음 과 같 다 . >> integralright shift with sign extension ( ) >>> integralright shift with zero extension ( 0 ) << integralleft shift shift 연산자 는 ' int ', ' byte ', ' short ', ' long ', ' char ' 형 에 대해서 만 정의 가 되 어 있 다 . 음수 + 양수 = 0 이 되 도록 하 게 한 것 이 2 의 보수 이 다 . ( 즉 음수 를 나타내 기 위해 만든 것 ) 음수 인 경우 - 양수 를 2 진수 로 바꾼다 . - 2 의 보수 를 취한다 ( 100 ( - byte 인 경우 ) - 숫자 ) ( - 연산 한다 . - 부호 비트 ( 1 ) 이 면 2 의 보수 를 취한 후 ( -) 를 붙인다 . ' int ', ' byte ', ' short ', ' char ' 데이터 형 에 대해서 는 int 형 으로 캐스팅 ( modulo - 32 연산 ) 을 한 후 shift 연산 을 수행 하 고 , ' long ' 데이터 형 에 대해서 는 modulo - 64 연산 을 수행 한 후 shift 연산 을 수행 한다 . " i >>= 33 ;" 와 " i >>= 1 ;" 은 같 은 결과 를 가져온다 . ( ' i ' 가 ' int ' 일 때 ) " l >>= 64 ;" 와 " l >>= 0 ;" 은 같 은 결과 를 가져온다 . ( ' l ' 이 ' long ' 일 때 ) '<<', '>>' 연산자 는 산술 연산자 이 고 , '>>>' 연산자 는 논리 연산자 이 다 . '<<' : ' 0 ' 을 채우 면서 좌 로 shift 128 << 1 gives 128 * 21 = 25616 << 2 gives 16 * 22 = 64 '>>' : 부호 비트 를 채우 면서 우로 shift 128 >> 1 gives 128 / 21 = 64 - 256 >> 4 gives - 256 / 24 = - 16 '>>>' : ' 0 ' 을 채우 면서 우로 shift '<<<' : 정의 되 어 있 지 않 다 . ,'<<' , '>>','>>>' : ' byte ', ' short ', ' char ' 데이터 형 에 대해서 는 먼저 int 로 캐스팅 이 된 후 에 계산 이 되 므로 , 결국 은 int , long 형 의 데이터 에 만 적용 된다 . 예 ) byte b = 6 ; b = b >>> 2 ; / / error '>>>' 연산자 가 ' byte ', ' short ' 데이터 에 적용 되 면 부호 비트 가 ' int ' 데이터 의 크기 만큼 확장 되 어서 , 음 수일 경우 에 는 산술 연산자 와 동일 하 게 동작 을 하 게 된다 . 물론 양수일 경우 에 는 논리 연산자 와 동일 하 게 동작 한다 . 예제 ) class ShiftTest { public static void main ( String args [ ] ) { int a = 0 x 00000010 ;// 0000 0000 0000 0000 0000 0000 0001 0000 int ans ; System . out . println ( ">> operator -------"); System . out . println ( " before : " + a ) ; ans = a >> 1 ; System . out . println ( " after : " + ans ) ; a = 0 x 80000000 ;// 1000 0000 0000 0000 0000 0000 0000 0000 -> - 2147483648 System . out . println ( " before : " + a ) ; ans = a >> 1 ; System . out . println ( " after : " + ans ) ; System . out . println ( " >>> operator ------"); System . out . println ( " before : " + a ) ; ans = a >>> 1 ; System . out . println ( " after : " + ans ) ; System . out . println ( " << opearator ------"); a = 0 x 40000000 ;// 0100 0000 0000 0000 0000 0000 0000 0000 -> 1073741824 System . out . println ( " before : " + a ) ; ans = a << 1 ; System . out . println ( " after : " + ans ) ;}} 결과 >> operator ------- before : 16 after : 8 before : - 2147483648 after : - 1073741824 >>> operator ------ before : - 2147483648 after : 1073741824 << opearator ------ before : 1073741824 after : - 2147483648 castingshort 와 ' char ' 사이 의 변환 은 언제나 명시 적 인 캐스트 를 하 여야 한다 . ' boolean ' 은 어떤 데이터 와 도 변환 이 안 된다 . 캐스트 없이 변환 이 가능 한 경우 from byte : ' short ', ' int ', ' long ', ' float ', ' double ' from short : ' int ', ' long ', ' float ', ' double ' from char : ' int ', ' long ', ' float ', ' double ' from int : ' long ', ' float ', ' double ' from long : ' float ', ' double ' from float : ' double ' 데이터 의 손실 이 발생 할 수 있 는 경우 from byte : ' char ' from short : ' byte ', ' char ' from char : ' byte ', ' short ' from int : ' byte ', ' short ', ' char ' from long : ' byte ', ' short ', ' char ', ' int ' from float : ' byte ', ' short ', ' char ', ' int ', ' long ' from double : ' byte ', ' short ', ' char ', ' int ', ' long ', ' float ' primitive type 사이 에서 의 연산 의 결과 의 최소 의 type 은 int 이 다 . short , byte 의 연산 의 결과 도 int 이 다 . 그러므로 다음 처럼 해 주 어야 한다 . byte b = 7 ; byte t = 9 ; int s = b + t ; 또는 byte s =( byte ) ( b + t ) ; Flow contolBranching Statements / * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -----------------------*/ if ( boolean _ ｅxpression ) statement _ or _ blockelsestatement _ or _ block / * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * / / * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -----------------------*/ switch ( expr 1 ) { case expr 2 : statements ; break ; case expr 3 : statements ; break ; case expr 4 : statements ; break ; default : statements ; break ; } / * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -----------------------*/ Looping Statements / * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -----------------------*/ for ( init _ expr ; boolean ; alter _ expr 3 ) statement _ or _ block / * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * / / * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -----------------------*/ while ( boolean ) statement _ or _ block / * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * / / * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -----------------------*/ dostatement _ or _ blockwhile ( boolean ) ; / * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -----------------------*/ Special Loop Flow Control / * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -----------------------*/ break [ label ] ; continue [ label ] ; label : statement ; exampleloop : while ( true ) { for ( int i = 0 ; i < 100 ; I ++){ switch ( c = in . read ( ) ) { case - 1 : case '\ n ':// jumps out of while - loop to line # 12 break loop : ...}}// end for ] / / end whiletest : for ( ...){..... while ( ...){ if ( j > 10 ) {// jumps to next iteration of for - loop at line # 13 continue test ; } } } / * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -----------------------*/ Lab . Create a Factorial Application 1 . Factorial - recursion 을 이용 한 factorial . . . / * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -----------------------*/ public class FactoEx { public int Factorial ( int i ) { if ( i > 1 ) return i * Factorial ( i - 1 ) ; elsereturn 1 ;} public static void main ( String args [ ] ) { FactoEx f 1 = new FactoEx ( ) ; System . out . println ( f 1 . Factorial ( Integer . parseInt ( args [ 0 ] ) ) ) ; } } / * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -----------------------*/ Lab . Solve a Geometry Program 제곱근 구하 는 프로그램 참고 ) String a -> intString a -> floatString a -> doubleInteger . parseInt ( a ) Float . valueof ( a ) . floatValue ( ) Double . valueof ( a ) . doubleValue ( ) int b -> Stringfloat b -> Stringdouble b -> StringInteger . toString ( b ) Float . toString ( b ) Double . toString ( b ) / * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -----------------------*/ public class Tri { public static void main ( String args [ ] ) { double a = 0 . 0 ; double b = 0 . 0 ; double c = 0 . 0 ; if ( args . length > 2 ) { System . err . println ( " Error "); System . exit ( 1 ) ;} a = Double . valueOf ( args [ 0 ] ) . doubleValue ( ) ; b = Double . valueOf ( args [ 1 ] ) . doubleValue ( ) ; c = Math . sqrt ( Math . pow ( a , 2 ) + Math . pow ( b , 2 ) ) ;// sqrt - 제곱근 , pow - 제곱 System . out . println ( " A : "+ a +" B : "+ b +" Result : " + c ) ; } } / * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --------------------*/*** Java Tri 3 4 -> args [ 0 ] - 3 , args [ 1 ] - 4 Lab . 사칙 연산 을 수행 하 는 계산 프로그램 class FourCalc { double calc ( double i , double j , char k ) { switch ( k ) { case '+': return i + j ; case '-': return i - j ; case ' X ': return i * j ; case '/': return i / j ; default : return 0 . 0 ;}} public static void main ( String args [ ] ) { FourCalc f = new FourCalc ( ) ; System . out . println ( f . calc ( Double . valueOf ( args [ 0 ] ) . doubleValue ( ) , Double . valueOf ( args [ 1 ] ) . doubleValue ( ) , args [ 2 ] . charAt ( 0 ) ) ) ;}} Lab . 다음 과 같이 구구단 을 출력 하 는 자바 프로그램 을 작성 하 시 오 . 2 * 1 = 2 , 3 * 1 = 3 , 4 * 1 = 4 , 5 * 1 = 5 , 6 * 1 = 6 , 7 * 1 = 7 , 8 * 1 = 8 , 9 * 1 = 9 . ........................ class GuGuDan { void calc ( ) { for ( int i = 2 ; i <= 9 ; i ++){ for ( int j = 1 ; j <= 9 ; j ++){ System . out . print ( i +"*"+ j +"="+ i * j +" ");} System . out . println ( " ");}} public static void main ( String args [ ] ) { GuGuDan gu = new GuGuDan ( ) ; gu . calc ( ) ;}}