Java 자료구조-
Abstract(추상화) - 복잡한 현실세계를 사용자의 요구에 맞게 단순화, 클래스(멤버변수, 멤버메소드)
ㅁ Encapsulation(은닉화) - 구현을 숨기고 사용법만 알면 동일한 방법으로 재사용가능 (private, setxxx(), getxxx()를 통해 값 변경)
ㅁ Inheritance(상속) - 단일상속만 지원, 인터페이스를 통해 다중상속 지원
- 상속받은 부모꺼는 모두 내꺼, 생성자는 상속에서 제외(호출하여 사용)
- 생성자를 명시적으로 작성한 경우 자동으로 생성 및 초기화가 되지 않으므로
- 자식 생성자의 첫번째 라인에서 super()로 호출.
- 생성자는 생략되기 때문에 자식 생성자의 첫번째 라인에서 super()로 호출.
- 같은 클래스 - 객체생성 없이 참조, 다른 클래스 - 객체생성 해서 참조
- 클래스간 상속, 인터페이스간 상속은 extends 키워드 사용
- 클래스와 인터페이스
ㅁ Polymorphism(다형성) - 상속이 전제, 부모 타입의 자식을 참조하여 객체생성,
- 객체의 다형성
super type의 객체 생성시 sub 생성자 참조 가능
메모리에 초기화된 형태로만 타입캐스팅
캐스트 업 - 다형성, 묵시적 일어남
캐스트 다운 - 명시적으로 타입캐스팅해야함, 참조된 Sub Type으로만 타입캐스팅 가능
오버라이딩 : 부모클래스의 method와 method명, return type, argument-list 반드시
동일해야 하고 구현만 다르게 함(Virtual method Invocation)
=> 해당 메소드를 호출하면 오버라이딩된 자식method가 호출(응답)
메소드 오버라이딩 :
접근자(Access modifier:public,protected,defalt,private)는 부모와 동일하게 적용하거나 확장만 가능
Exception(예외)는 축소만 가능
차이점 : 오버로딩은 메소드 이름 같고 인수값이 달라함, 오버라이딩은 상속이 전제된 상태에서 모든게 일치해야 함
ㅁ Promotion
1 2 4 8 4 8 byte
- 순서 : byte -> short -> int -> long -> float -> double (작은 것 -> 큰것)
char ->
- 논리형(boolean)은 ture, false만 존재하므로 다른 숫자형으로 Promotion이 일어나지 않음
ㅁ 타입캐스팅 이해
- cast-up(자식 ->부모) : 묵시적으로 처리되므로 타입캐스팅 불필요
- cast-down(부모 ->자식) : 명시적으로 타입캐스팅해서 사용
- 아래 예제는 부모 타입의 자식 객체 생성시 부모타입 변수 생성 및 사용가능, 자식의 변수는 생성만 되어 있어
사용시 자식타입으로 강제 형변환해야 사용가능함 그렇지 않으면 컴파일시 cannot find symbol 오류 발생
ex) class Person {
int age;
String name;
}
class Student extends Person{
int id;
Person p = new Student();
System.out.println( ((Student)p).id);
}
[Person] <- 부모클래스
< name, age >
│(상속관계)
┌────────┼─────────┐
[Student] [Teacher] [Empolyee] <- 자식클래스
< id >
[] Access modifier(접근제한자)
===========================================================================================
상속관계
구분 어디서나 접근 서로다른 패키지 같은 패키지 같은 클래스
-------------------------------------------------------------------------------------------
public ㅇ ㅇ ㅇ ㅇ
protected x ㅇ ㅇ ㅇ
default(생략) x x ㅇ ㅇ
private x x x ㅇ
===========================================================================================
[] usage modifier - 클래스명 앞에 쓸수 있는 usage modifier
===========================================================================================
구분 class variable method
-------------------------------------------------------------------------------------------
static 사용불가 class variable class method
final 상속불가 값변경 불가(상수) overriding할 수 없음
abstract 객체 생성할 수 없음 구현이 없음
(new 사용못함) ex) abstract void a();
===========================================================================================
* static - 클래스명으로만 참조, 한번만 초기화, 공유하여 사용
- main() 실행되기 전에 단 1번 초기화 되어 메모리에 로딩됨으로 객체 생성할 필요없이
바로 사용가능. 단, static 메소드에서 non-static 메소드 호출시는 객체 생성 해야함
* final variable은 값 변경할 수 없고(상수, 초기값으로사용), method는 오버라이딩할 수 없고, class는 상속할 수 없음
* abstract - 부모클래스에 구현없이 정의된 abstract메소드를 상속받은 자식클래스에서는 반드시 구현해야함,
- 오버라이딩해서 사용해야하는 강제성 부여됨
- abstract 클래스로만 구성된 것을 interface
=> 다형성의 원리 이용
---------------------------------------------------------------------------------------------------------------------------
형변환과 캐스트 연산자-
[형의 변환]
java 에서는 정수끼리 계산을 하면, 그 결과는 정수가 된다는 규칙이 있다.
즉, 결과값으로 예상되는 형을 잘 선택해야 하고, 지정된 형보다 더 작은 범위의 자료형에 대입해서도 안된다.
3/2 를 한다면, 결과는 소숫점이 나오지만, 결과는 1 이 되는 것이다.
따라서, 결과값의 정확한 소숫점을 표현하기 위해서는 대입전의 자료형을 실수형으로 선언해야 한다.
즉,
3.0/2.0 = 1.5
로 처리해야만 한다.
short s = 256;
byte b = 12;
int a = s + b;
라는 처리문이 있다면,
결과변수인 a 를 int 형으로 선언했기 때문에, 결과값이 268 은 int 결과로 대입된다.
float a = 3.1f;
float b = 2.2f;
int c = a + b;
라고 한다면, 실수(float) 로 계산을 했지만, 결과값을 정수형(int) 에 대입하게 되므로,
결과값이 5.3 에서 0.3 이 잘려나가 5가 출력되는 셈이다.
그러나, 위와같은 로직은 사용할 수 없다.
그것은, 컴파일시 변수 c 에 값을 대입할 수 없다는 에러가 발생하기 때문이다.
이것은, 자동 형변환이 일어나지 않아서 인데,
이런경우, 캐스트 연산자를 이용해 자동으로 형변환을 해주면 에러가 발생하지 않는다.
float a = 3.1f;
float b = 2.2f;
int c = (int)(a + b);
이렇게 처리해주면 에러가 발생하지 않고, 소숫점이 잘려나간 5 값이 출력된다.
또는, 아래와 같이 할 수 있다.
float a = 3.0f;
float b = 2.0f;
int c = (int)a / (int)b;
이는, 대부분의 프로그램에서는 공통이지만, 4G 레벨의 언어에서는 굳이 이렇게 하지 않아도 소숫점으로 표현해준다.
자바스크립트나 ASP, PHP 등에서는 굳이 이렇게 하지 않아도, 자동으로 형변환이 이루어져 소숫점으로 표현해준다.
자바에서도 형변환이 자동으로 이루어진다.
즉, 좁은 범위의 자료형으로 계산을 하거나, 형이 다른 변수끼리 대입하거나, 값의 범위가 좁은 변수를
값의 범위가 넓은 변수로 대입하면 자동으로 형변환이 되는데,
만약, 범위가 넓은 변수를 좁은 범위의 변수에 대입하려 하면 에러가 발생한다.
int i = 8;
float f = i;
는 유효하지만,
double d = 2.8;
long l = d;
는 에러가 발생한다.
주의할점은, 자동으로 형변환이 이루어지는 것은 '대입' 할 경우에만 해당한다는 것이다.
아래와 같은 로직은 에러가 발생한다.
float a = 3.1f;
int b = 2;
int c = a + b;
즉, 자료형이 틀린 a 와 b 를 계산하지 못하는데,
이런경우, 두 자료형의 종류를 일치시켜줘야 한다.
그래서, 위에서 처럼 같은 자료형으로 계산한뒤, 캐스트 연산자를 이용해 형변환을 시키는 것이다.
캐스트 연산자는 자료형의 이름을 괄호를 이용해서 둘러싼뒤 값이나 변수를 그 뒤에 기술하는 것으로,
임의로 특정 자료형으로 변환시키는 것이다.
이러한 조작을 형 변환(캐스트) 라고 하며 () 를 캐스트 연산자라고 한다.
가장 간단한 예로, 실수형 결과가 예상되는 두 정수형 자료의 연산을 처리하면,
두가지가 가능하다.
(float)3/2
또는
3/(float)2
로 하면, 모두 결과값이 1.5 가 나온다.
일반적으로 위의 경우에서처럼 숫자를 변수에 담지 않을때는(대입하지 않을때는), 별도로 자료형을 선언할 필요는 없다.
다만, 의도적으로 결과값을 특정 자료형으로 출력시키기 위해 위와같은 캐스트 연산자를 이용할 수 있다.
자료형의 유효범위를 순서대로 보면,
double > float > long > int > short > byte
순이다.
'School Study' 카테고리의 다른 글
[BSP]업무일지 - 2010729 (0) | 2010.07.29 |
---|---|
[BSP]업무일지 - 2010728 (0) | 2010.07.28 |
[BSP]업무일지 - 2010726 (0) | 2010.07.27 |
[BSP]업무일지 - 20100719 (0) | 2010.07.19 |
[업무일지]20100712-임종현 (0) | 2010.07.12 |