총 게시물 25건, 최근 0 건 안내 RSS 글쓰기
이전글  다음글  목록 글쓰기
[1.기본 지식편]

5장 연산자

글쓴이 : 카이로 날짜 : 2014-02-04 (화) 21:59 조회 : 9293
글주소 : http://www.androidside.com/430/85
5장 연산자
5.1  소개
연산자는 변수의 값을 변경하기 위해 사용하는 부호로서 일반적으로 잘 알고 있는 산술 연산자(Arithmetic Operators)와 비트 연산자(Bitwise Operators) 그리고 이동 연산자(Shift Operators) 등 매우 다양한 연산자들이 존재한다. 이들 연산자들은 프로그램에서 자주 사용되기 때문에 어떤 종류의 연산자가 존재하고 해당 연산자들을 어떻게 사용해야 하는지에 대해서 알아두어야 한다.

5.2  산술 연산자(Arithmetic Operators)
자바에서는 덧셈, 뺄셈, 곱셈, 나눗셈과 같은 일반적인 산술 연산을 위한 +, -, *, / 연산자와 나머지를 구하기 위한 % 연산자를 산술 연산자라고 한다. 산술 연산자는 기본적으로 이항 연산을 위해 사용되지만 + 와 ? 연산자는 단항 연산을 위해 사용되기도 한다. 다음은 이러한 산술 연산자에 대해 정리한 것이다.

표 5-1-1 산술 연산자
5-2-1.PNG

산술 연산을 할 경우 피연산자의 형에 의해 그 결과 데이터형이 달라질 수 있다. 예를 들어 int 형과 double 형을 더할 경우에 그 결과는 int 형이 아닌 double 형이 된다. 왜냐하면 double 형이 int 형보다 더 큰 데이터형이라서 + 연산시 int 형이 자동으로 double 형으로 변환되어 연산되기 때문이다. 자바에서 적용되는 산술 규칙을 정리하면 다음과 같다.

표 5-1-2 산술 규칙
5-2-2.PNG
※ boolean 형은 산술 연산의 대상이 아니다.

산술 연산은 byte, short, char, int, long, float, double 형에 대해서만 수행되며 byte, short, char 형은 산술 연산시 int 형으로 변환되어 수행된다. 그렇기 때문에 int 형보다 작은 데이터형의 산술 연산은 항상 int 형의 결과를 반환한다. 

표 5-1-3 산술 규칙 예제
5-2-3.PNG


5.3  증가/감소 연산자(Increment/Decrement Operators)
증가/감소 연산자는 산술 연산자의 일종으로서 변수의 값을 1만큼 증가/감소시키기 위해서 사용하는 연산자이다. 증가/감소 연산자는 다른 연산자와는 달리 선언되는 위치에 따라 연산 시점이 달라진다. 먼저 증가/감소 연산자가 피연산자 앞에 선언되는 전치형인 경우에는 해당 문장이 실행되기 전에 피연산자의 값이 변경되며 피연산자 뒤에 선언되는 후치형인 경우에는 피연산자의 값이 해당 문장이 끝난 후에 변경된다. 다음은 증가/감소 연산자의 적용 결과를 전치형과 후치형으로 구분하여 보여준다.

표 5-2-1 증가/감소 연산자
5-3-1.PNG


5.4  대입 연산자(Assignment Operators) 
대입 연산자는 "=" 연산자처럼 변수에 값을 설정하기 위해 사용하는 연산자를 말하며 산술 연산자, 비트 연산자, 시프트 연산자와 함께 사용되어 단축형 연산을 지원하기도 한다.

표 5-3-1 단축형 대입 연산자 
5-4-1.PNG
※ 표에서 결과는 a = 4, b = 3 으로 해당 연산을 수행한 후의 a 의 값이다.


5.5  관계 연산자(Relational Operators) 
관계 연산자는 피연산자들의 관계를 비교하기 위해 사용하는 연산자로서 연산의 결과는 항상 논리형인 true 나 false 로 표현된다. 관계 연산자에는 기본 데이터형을 비교하기 위한 <, <=, >, >= 연산자와 기본 데이터형과 참조형 모두 비교할 수 있는 ==, != 연산자가 있다. 관계 연산자를 종류별로 정리하면 다음과 같다.

표 5-4-1 관계 연산자 
5-5-1.PNG

관계 연산자의 ==, != 연산자로 참조형을 비교할 경우 참조형의 값을 비교하는 것이 아니라 주소를 비교한다는 것에 주의해야 한다. 다음 예제를 보도록 하자.

String a = newString("a");
String b = newString("a");
 
if (a != b) System.out.println("a != b");
if (a == b) System.out.println("a == b");
 
이 예제를 실행하면 화면에는 "a != b" 가 출력된다. 문자열 a 와 b 는 분명 같은 문자열을 가지고 있지만 해당 변수들이 모두 참조형이기 때문에 변수 a 와 b 에는 실제 문자열 값이 아니라 생성된 객체에 대한 주소가 들어가 있다. 그리고 new 연산자에 의해 생성된 문자열 객체의 주소는 항상 서로 다르기 때문에 화면에는 "a != b" 가 출력된다.



5.6  비트 연산자(Bitwise Operators)
산술 연산자는 기본 데이터형 단위로 연산을 수행하는 반면에 비트 연산자는 비트 단위로 연산을 수행한다. 여기서 말하는 비트(bit)는 컴퓨터가 데이터를 표현하기 위한 기본적인 단위로서 0과 1를 표현할 수 있으며 이를 2진수라고 한다. 이러한 비트들이 8개 모이면 byte 를 표현할 수 있으며 byte 가 2개가 모이면 short 형을 표현할 수 있고 4개가 모이면 int 형을 표현할 수 있다. 이렇게 비트가 모여 표현할 수 있는 기본 데이터형의 크기는 얼마나 많은 비트가 모였느냐에 따라 달라진다. 

이 장에서는 비트 연산를 수행하는 &, |, ^, ~ 연산자에 대해서 살펴보도록 하겠다. 이 연산자들은 항상 모든 연산을 32 비트로 처리한다는 것에 주의해야 한다.


1) & 연산자 
& 연산자는 AND 연산자라고 하며 두 개의 피연산자 비트를 비교하여 모두 1이면 1을 반환하고 그렇지 않으면 0을 반환한다.

5-6-1.PNG

다음은 3과 5를 AND 연산하는 것을 보여준다. 비트 연산은 항상 비트 단위로 처리되기 때문에 3 & 5 의 연산 결과를 알아보기 위해서는 먼저 해당 숫자를 2진수로 표현해야 한다.

5-6-2.PNG

[TIP&TECH]
2진수를 표현하는 방법은 이 책의 [기타 지식편]을 참고하기 바란다.


지금까지 살펴본 AND 연산자는 비트 연산자로 사용될 수도 있지만 논리 연산자로도 사용될 수 있다. 왜냐하면 true 나 false 와 같은 논리값은 내부적으로 1과 0으로 표현되기 때문이다. 

5-6-3.PNG

2) | 연산자 
| 연산자는 OR 연산자라고 하며 두 개의 피연산자 비트를 비교하여 모두 0이면 0을 반환하고 그렇지 않으면 1을 반환한다.

5-6-4.PNG

다음은 3과 5를 OR 연산하는 것을 보여주며 3 & 5의 결과를 알기 위해서는 먼저 해당 숫자값을 2진수로 변환해서 OR 연산해야 한다.

5-6-5.PNG


이전에 살펴본 AND 연산자와 마찬가지로 OR 연산자도 논리 연산자로 사용할 수 있다. 

5-6-6.PNG


3) ^ 연산자 
^ 연산자는 XOR(Exclusive OR) 연산자라고 하며 두 개의 피연산자를 비교하여 서로 같으면 0을 반환하고 그렇지 않으면 1을 반환한다.

5-6-7.PNG


다음은 3과 5를 XOR 연산하는 것을 보여주며 3 ^ 5의 결과를 알기 위해서는 먼저 해당 숫자값을 2진수로 표현해서 XOR 연산해야 한다.

5-6-8.PNG


4) ~ 연산자 
~ 연산자는 보수(Complement) 연산자라고 하며 피연산자의 비트가 0이라면 1을 반환하고 그렇지 않으면 0을 반환한다.

5-6-9.PNG


다음은 3 을 보수 연산하는 것을 보여준다. 보수 연산의 결과를 알기 위해서는 해당 숫자값을 2진수로 표현해서 0이면 1로, 1이면 0으로 변환해야 한다.

5-6-10.PNG



5.7  논리 연산자(Logical Operators)
논리 연산자는 true 나 false 와 같은 논리값을 연산하기 위한 것으로서 !, &&, || 가 있다. 이 연산자들의 피연산자에는 true 나 false 를 표현할 수 있는 표현식이 와야 하며 연산의 결과는 항상 true 나 false 가 된다.

1) ! 연산자 
논리값에 대한 부정을 나타낸다. 다음 표와 같이 논리값이 true 이면 결과값은 false 가 되고 논리값이 false 이면 결과값은 true 가 된다.

5-7-1.PNG

다음은 ! 연산자 사용 예제를 보여준다.

코드)
boolean a = !(3 > 2); 

3 은 2보다 크기 때문에 (3 > 2) 의 연산의 결과는 true 이다. 이 true 에 대해 ! 연산자를 적용하면 논리값이 반대가 되기 때문에 변수 a 에는 false 가 설정된다.


2) && 연산자 
피연산자의 논리값을 비교하기 위한 AND 연산자로서 피연산자가 모두 true 이면 결과값은 true 가 되고 그렇지 않으면 결과값은 false 가 된다. 

5-7-2.PNG


다음은 && 연산자 사용 예제를 보여준다.

코드)
boolean a = (3 > 2) && (2 > 3); 

(3 > 2) 는 true 이고 (2 > 3) 은 false 이기 때문에 && 연산자를 적용한 후의 변수 a 의 값은 false 가 된다. 이 연산자를 적용할 경우 피연산자 중에 어느 한쪽이라도 false 이면 그 결과는 항상 false 가 된다.


3) || 연산자 
AND 연산자처럼 피연산자의 논리값을 비교하기 위한 OR 연산자로서 피연산자가 모두 false 이면 결과값은 false 가 되고 그렇지 않으면 결과값은 true 가 된다.

5-7-3.PNG


다음은 || 연산자 사용 예제를 보여준다.
 
코드) 
boolean a = (3 > 2) || (2 > 3);

 (3 > 2) 는 true 이고 (2 > 3) 은 false 이기 때문에 || 연산자를 적용한 후의 변수 a 의 값은 true 가 된다. 이 연산자를 적용할 경우 피연산자 중에 어느 한쪽이라도 true 이면 그 결과는 항상 true 가 된다.


5.7.1  Short Circuit 기능
Short Circuit 기능은 전체 식을 평가하지 않고 부분만 평가하고서도 그 식의 결과를 알 수 있을 때 나머지 식을 평가하지 않는 것을 말한다. 이 기능은 &&와 || 연산자에만 적용된다. 그래서 아래 코드 에서 오른쪽의 & 연산자 코드는 에러가 발생한다.

코드 Short Circuit 기능
short_circuit.JPG

& 연산자를 적용한 코드에서 s는 null이기 때문에 s.length()는 NullPointerException을 발생시킨다. 


5.8  이동 연산자(Shift Operators) 
이동 연산자는 이전에 살펴본 비트 연산자와 마찬가지로 비트 단위로 연산을 수행한다. 비트 연산자는 비트를 비교하여 0과 1을 반환하는데 사용하는 반면에 이동 연산자는 비트를 이동시키기 위해 사용한다. 이동 연산자에는 <<, >>, >>> 가 있으며 모든 연산은 32비트 단위로 처리된다. 그렇기 때문에 비트의 수가 32보다 클 경우에는 X%32 만큼만 비트 이동하게 된다.


1) << 연산자(Left Shift)
<< 연산자는 지정된 크기 만큼의 비트를 왼쪽으로 이동시키고 오른쪽의 빈 공간을 0으로 채우는 연산자이다. 이 연산자를 적용하게 되면 가장 왼쪽에서 지정된 크기 만큼 밀려나는 비트들은 모두 사라진다.
 
5-8-1.PNG

<< 연산자를 사용하는 소스 코드를 살펴보면 다음과 같다. 

코드)
int a1 = 20 << 1;
int a2 = 20 << 33;
 
System.out.println("20 : " + Integer.toBinaryString(20));
System.out.println("a1 : " + Integer.toBinaryString(a1));
System.out.println("a2 : " + Integer.toBinaryString(a2));

코드) 실행결과
20 : 10100
a1 : 101000
a2 : 101000

20을 2진수로 표현하면 10100 이고 이를 왼쪽으로 1비트 이동시키면 101000이 된다. 물론 이러한 모든 연산은 32비트로 수행되기 때문에 왼쪽의 모든 비트들도 화면에 출력되어야 한다고 생각할 수 있지만 0은 무의미한 값이기 때문에 화면에는 101000만 출력된다. 그리고 비트 연산은 32비트로 수행되기 때문에 32보다 큰 값을 지정한 33은 33%32의 결과인 1비트만 왼쪽으로 이동시키게 된다. 그래서 a1 과 a2 의 결과값은 동일하다.


2) >> 연산자(Right Shift)
>> 연산자는 지정된 크기 만큼의 비트를 오른쪽으로 이동시키고 왼쪽의 빈 공간을 부호 비트로 채우는 연산자이다. 그래서 이 연산자를 적용하면 항상 최초의 연산 대상의 부호는 유지됨으로 음수가 양수로 변하는 일이 발생하지 않는다. 여기서 말하는 부호 비트는 가장 왼쪽의 비트를 말하는 것으로서 이 비트가 1이면 음수이고 0이면 양수를 나타낸다. 이 연산자를 적용하게 되면 가장 오른쪽에서 지정된 크기 만큼 밀려나는 비트들은 모두 사라진다.

5-8-2.PNG
※ 그림에서 상단의 가장 왼쪽의 비트가 0 이라면 하단의 왼쪽 3비트는 모두 0이 된다.


>> 연산자를 사용하는 소스 코드를 살펴보면 다음과 같다. 
 
코드)
int a1 = 20 >> 1;
int a2 = 20 >> 33;
 
int b1 = -20 >> 1;
int b2 = -20 >> 33;
 
System.out.println("20 : " + Integer.toBinaryString(20));
System.out.println("a1 : " + Integer.toBinaryString(a1));
System.out.println("a2 : " + Integer.toBinaryString(a2));
 
System.out.println("-20 : " + Integer.toBinaryString(-20));
System.out.println("b1 : " + Integer.toBinaryString(b1));
System.out.println("b2 : " + Integer.toBinaryString(b2));


코드) 실행 결과
20 : 10100
a1 : 1010
a2 : 1010
-20 : 11111111111111111111111111101100
b1 : 1111111111111111111111111111111111111111111111111111111111110110
b2 : 1111111111111111111111111111111111111111111111111111111111110110

20을 2진수로 표현하면 10100 이고 이를 오른쪽으로 1비트 이동시키면 왼쪽 비트는 0으로 채워지기 때문에 1010이 된다. 하지만 -20을 오른쪽으로 1비트 이동시키면 왼쪽 비트는 부호 비트인 1로 채워지기 때문에 결과값은 다음과 같이 음수가 된다.


3) >>> 연산자(Unsigned Right Shift)
>>> 연산자는 지정된 크기 만큼의 비트를 오른쪽으로 이동시키고 왼쪽의 빈 공간을 0으로 채우는 연산자이다. 그렇기 때문에 음수에 이 연산자를 적용하면 그 결과는 양수가 된다. 이 연산자를 적용하면 >> 연산자처럼 오른쪽으로 밀려나는 비트 연산자는 모두 사라진다.

5-8-3.png

>>> 연산자를 사용하는 소스 코드를 살펴보면 다음과 같다. 
 
코드) 
int a1 = 20 >>> 1;
int a2 = 20 >>> 33;
 
System.out.println("20 : " + Integer.toBinaryString(20));
System.out.println("a1 : " + Integer.toBinaryString(a1));
System.out.println("a2 : " + Integer.toBinaryString(a2));


코드) 실행 결과
20 : 10100
a1 : 1010
a2 : 1010
 
>>> 연산자와 >> 연산자의 실행 결과는 연산 대상의 값이 양수일 경우에는 동일하기 때문에 다음 소스 코드의 실행 결과는 >> 연산자의 실행 결과와 동일하다.



5.9  조건 연산자(? :)
조건 연산자는 해당 조건이 true 이면 정의된 첫 번째 문장을 실행하고 그렇지 않으면 두 번째 문장을 실행하는 연산자로서 제어문인 if-else 문과 동일한 기능을 한다. if-else 문에 대한 자세한 설명은 나중에 하기로 하고 여기서는 이해를 돕기 위해 if-else 문의 구조만 간단히 살펴보도록 하겠다.

코드) if-else문 구조
if (표현식) {
    문장1;
} else {
    문장2;
} 

if-else 문은 표현식이 true 이면 문장1을 실행하고 false 이면 문장2를 실행하는 구조로 되어 있다. 이러한 if-else 문을 우리가 지금 알아보려고 하는 조건 연산자 구조로 변환하면 다음과 같다.

코드) 조건 연산자 구조
표현식? 문장1 : 문장2;
 
if-else 문과 조건 연산자의 구조중 무엇이 다른가? 조건 연산자에는 if-else 문과 대괄호({, }) 가 없다는 것을 제외하면 매우 유사한 구조라는 것을 알 수 있다. 그래서 조건 연산자를 if-else 문의 축약형이라고도 한다. if-else 문의 표현식에는 항상 true 나 false 로 표현될 수 있는 식이 와야 하는 것처럼 조건 연산자의 표현식에도 항상 true 나 false 로 표현될 수 있는 식이 와야 한다.


이제 조건 연산자의 사용 예제를 if-else 문의 예제와 함께 살펴보도록 하자.

코드) if-else 문
int a = 4;
int result = 0;
 
if (a > 5) {
    result = a;
} else {
    result =0;
}

코드) 조건 연산자
int a = 4;
 
int result = (a > 5) ? a : 0 ;


이 예제는 a 의 값을 평가하여 5보다 크면 a 의 값을 result 에 대입하고 그렇지 않으면 0을 result 에 대입하는 소스 코드이다. 이 코드를 통해 if-else 문과 조건 연산자는 동일한 기능을 수행하지만 작성된 코드의 양은 서로 틀리다는 것을 알 수 있다. 그래서 조건 연산자를 if-else 문의 축약형이라고 한다.


5.10  instanceof 연산자
instanceof 연산자는 프로그램 실행 중에 지정된 객체가 특정 클래스의 인스턴스인지 또는 특정 인터페이스를 구현하는지를 판단하기 위한 연산자이다.

instanceof 연산자의 구조는 다음과 같이 왼쪽에 참조 변수가 위치하며 오른쪽에는 클래스명 또는 인터페이스명이 위치한다. 이 연산자는 참조 변수가 가리키는 객체가 오른쪽 클래스의 인스턴스이거나 인터페이스를 구현하는 객체라면 true 를 반환하고 그렇지 않으면 false 를 반환한다. 

코드) instanceof 연산자 구조
참조변수 instanceof <클래스명, 인터페이스명>


이제 instanceof 연산자를 사용하는 간단한 예제를 살펴보도록 하자. 프로그램을 작성하다보면 넘어온 매개 변수의 데이터형에 따라서 실행을 다르게 해야 하는 경우가 있다. 예를 들어서 예외가 매개 변수로 넘어왔을 경우, 해당 예외가 NullPointerException 이라면 A 메소드를 호출하고 ArithmeticException 이라면 B 메소드를 호출해야 하는 경우 또는 매개 변수가 String 객체일 경우에는 A 메소드를 호출하고 String 객체가 아닐 경우에는 B 메소드를 호출해야 하는 경우를 들 수 있다. 이러한 경우처럼 클래스 형에 따라서 동작을 달리해야 한다면 instanceof 연산자를 사용하는 것이 가장 적절한 방법이다.

코드) instanceof 연산자 예제
public voidcall_me(Exception e) {
    if (e instanceof NullPointerException) {
        call_a();
    } else if (e instanceof ArithmeticException) {
        call_b();
    } else {
        call_c();
    }
}
 
이 소스 코드에서 매개 변수로 넘어온 예외가 NullPointerException 이라면 call_a() 메소드를 호출하고 ArithmeticException 이라면 call_b() 메소드를 호출한다. 어느 것도 아니라면 call_c() 메소드를 호출한다.


instanceof 연산자 사용시 왼쪽의 피연산자에는 항상 객체를 가리키는 참조 변수가 와야하며 오른쪽에는 클래스나 인터페이스가 와야 한다. 또한 왼쪽 피연산자가 가리키는 객체는 항상 오른쪽 클래스와 상속 관계에 있는 있는 인스턴스이어야 한다. 상속 관계에 있으면서 왼쪽이 같은 클래스이거나 하위 클래스라면 true 를 반환하고 아니면 false 를 반환한다. 다음 표는 instanceof 연산자를 사용한 다양한 예제와 그 결과를 보여준다. 

사용 예제

결과

설명

"test" instanceof String

true

String 객체 "test" String 클래스의 인스턴스이기 때문에 true 를 반환한다.

"test" instanceof Object

true

Object 클래스는 자바의 최상위 클래스이기 때문에 이 예제의 결과는 true 가 된다.

null instanceof String

false

참조 변수의 디폴트 값은 null 이지만 String 객체의 인스턴스가 아니기 때문에 false 가 된다.

(new Object()) instanceof String

false

Object 객체는 String 클래스의 하위 클래스가 아니기 때문에 false 를 반환한다.

"test" instanceof Vector

error

String 객체 "test" Vector 는 서로 상속관계에 있지 않기 때문에 컴파일시 에러가 발생한다.

10 instanceof Integer

error

10 은 기본 데이터형이기 때문에 컴파일시 에러가 발생한다.




5.11  형 변환(Type Conversions)
형 변환은 특정 데이터형을 다른 데이터형으로 변환하는 것을 말한다. 이러한 형 변환은 캐스팅(Casting) 연산자 사용 여부에 따라 다음처럼 분류할 수 있다. 참고로 캐스팅 연산자는 (int), (String) 처럼 특정 데이터형을 가로 안에 지정하는 것을 말한다.

그림 Casting 연산자 사용 여부에 따른 형 변환 분류
5-11-1.png

형 변환(Type Conversions)은 그 대상이 기본 데이터형(Primitive Data Type)인지, 참조형(Reference Type)인지에 따라 다음처럼 분류할 수 있다.


그림 변환 대상에 따른 형 변환 분류
5-11-2.png


 
5.11.1  기본 데이터형 변환(Primitive Conversions)
기본 데이터형 변환은 다음과 같은 두 가지 방식이 있다.

1) 축소 기본 데이터형 변환(Narrowing Primitive Conversions)
큰 기본 데이터형을 작은 기본 데이터형으로 변환하는 것이기 때문에 손실이 발생할 수 있다. 그래서 컴파일러가 알아서 변환할 수 없으므로 캐스팅 연산자를 사용해서 명시적(Explicit)으로 변환해야 한다. 이를 명시적 형 변환(Explicit Type Conversion)이라고 한다.


2) 확대 기본 데이터형 변환(Widening Primitive Conversions)
작은 기본 데이터형을 큰 기본 데이터형으로 변환하는 것이기 때문에 손실이 발생하지 않는다. 그래서 이 변환은 컴파일러에 의해 묵시적(Implicit)으로 수행된다. 이를 묵시적 형 변환(Implicit Type Conversion)이라고 한다.

그림 기본 데이터형 변환
5-11-1-1.png

※ 자바는 byte 형을 char형으로, char형을 short형으로 변환하는 것 그리고 boolean으로 변환하는 것을 허용하지 않는다.


표 5-10-1 기본 데이터형 변환 예제
5-11-1-2.png



5.11.2  참조형 변환(Reference Conversions)
참조형 변환은 다음처럼 두 가지 방식이 있다.

1) 축소 참조형 변환(Narrowing Reference Conversions)
상속 관계에 있는 두 데이터 중에서 상위 형을 하위 형으로 변환하는 것이다. 이때 실제 객체가 하위 객체라면 이상 없이 컴파일되고 실행된다. 이를 명시적 형 변환(Explicit Type Conversion)이라고 한다. 하지만 하위 객체가 아닐 경우에는 상위 형을 하위 형을 변환할 때 컴파일시 호환되지 않는 형(incompatible types) 에러가 발생한다.

2) 확대 참조형 변환(Widening Reference Conversions)
상속 관계에 있는 두 데이터 중에서 하위 형을 상위 형으로 변환하는 것이다. 이 변환은 이상 없이 컴파일되고 실행된다. 이를 묵시적 형 변환(Implicit Type Conversion)이라고 한다.


그림 참조형 변환
5-11-2-1.png


다음은 묵시적, 명시적 참조형 변환 예제를 보여준다. 참고로 Object는 모든 클래스의 최상위 클래스이므로 Object와 String은 상속 관계에 있다.

표 5-10-2 참조형 변환 예제
5-11-2-2.PNG



이 글은 무단전제나 무단배포가 금지된 글입니다. 공유하고자 한다면 제목과 링크만 공유하기 바랍니다.


로그인 창이 있는 "정보 수정"에서
서명 이쁘게 등록해보세요 ^^

glaxy 2014-02-04 (화) 22:27
오~5장 나왔네~
공부하고 시험봐야겠당~
댓글주소
Solomon 2014-02-18 (화) 11:11
감사합니다^^
댓글주소
jjinuri 2014-02-20 (목) 10:22
감사합니다 ^^
댓글주소
꾸꾸링 2014-07-11 (금) 11:58
감사합니다~!
댓글주소
YGFree 2014-08-08 (금) 14:14
잘봤습니다~
댓글주소
필연 2015-03-04 (수) 15:50
잘봤습니다~
댓글주소
공부좀 2015-06-26 (금) 23:39
감 사 합 니 다
댓글주소
공부좀 2015-06-27 (토) 02:39

역시 명강 입니다

댓글주소
대학생예비창… 2015-07-01 (수) 10:34
어렵다
댓글주소
잘반10세 2015-10-06 (화) 10:17
감사합니다.
댓글주소
indist 2016-10-03 (월) 04:18
댓글주소
이전글  다음글  목록 글쓰기

총 게시물 25건, 최근 0 건 안내 RSS
번호 분류 제목 추천 조회
25 0.소개  0.1 머리말 37 29 9508
24 0.소개  0.2 목차 16 10 6454
23 1.기본 지식편  0장 기본 지식편 27 30 9884
22 1.기본 지식편  1장 객체지향 프로그래밍 33 25 13365
21 2.코드 지식편  1장 0. 변수, 데이터형 20 15 7045
20 2.코드 지식편  1장 1. 가장 빠른 변수는 지역 변수이다. 19 14 7256
19 2.코드 지식편  1장 2. 멤버 변수를 중복 초기화하지 않는다. 17 11 7194
18 2.코드 지식편  1장 3. 멤버 변수의 디폴트 값에 대해 알아야 한다. 17 7 7444
17 2.코드 지식편  1장 4. 블록 내에서 사용할 변수는 지역 변수로 선언해야 한다. 16 12 6385
16 2.코드 지식편  1장 5. 자동 변수를 사용할 때는 항상 초기값을 설정해야 한다. 19 10 7015
15 2.코드 지식편  1장 6. 상수는 되도록 기본 데이터형을 사용해야 한다. 16 11 6684
14 2.코드 지식편  1장 7. 상수는 사용시 주의해야 한다. 20 11 6375
13 2.코드 지식편  1장 8. 변수는 되도록 사용 시점에 선언해야 한다. 15 7 5271
12 2.코드 지식편  1장 9. 객체보다는 기본 데이터형을 사용해야 한다. 13 7 5523
11 1.기본 지식편  1장 객체지향 프로그래밍 체크 포인트 17 9 5855
10 1.기본 지식편  2장 소스 코드 구성 28 15 9625
9 1.기본 지식편  2장 소스 코드 구성 체크 포인트 8 8 5317
8 1.기본 지식편  3장 클래스 구성 22 10 9297
7 1.기본 지식편  3장 클래스 구성 체크 포인트 6 4 5026
6 1.기본 지식편  4장 제한자 11 6 6858
5 1.기본 지식편  4장 제한자 체크 포인트 4 3 4746
4 1.기본 지식편  5장 연산자 11 7 9294
3 1.기본 지식편  5장 연산자 체크 포인트 4 5 5463
2 0.소개  스피드 자바의 오프라인 서적의 평. 11 8 6200
 


Copyright ⓒ www.androidside.com. All rights reserved.
채팅 권한: 글쓰기 1개
2레벨 이상만 대화 가능
공개 채팅: 평일 !(9시 ~ 17시),토,일
안사2 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기