목록java (47)
꿈 많은 사람의 이야기
instanceof는 객체 타입을 확인하는 연산자이다. 이 연산자는 부모 변수가 참조하는 객체가 부모 객체인지, 자식 객체인지 확인 할 수 있다. boolean result = 객체 instance of 타입 즉 좌항의 객체가 우항의 인스턴스 이면 즉, 우항의 타입으로 객체가 생성되었다면 true를 반환한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 class Parent2 { } class Child2 extends Parent2 { } class InstanceofExample { public void method..
클래스에서 자동 타입 변환은 다음과 같은 조건에서 일어난다. 부모 클래스 변수 = 자식 클래스 타입 일때 자동 타입 변환이 일어난다. 예를 들어 다음과 같은 상황이라 가정하자 이와 같은 상황일때 Cat cat = new Cat(); Animal ani = cat; 또는 Animal ani = new Cat(); 와 같이 타입 변환으로 객체를 생성할 수 있다. 위와 같은 상황에서 메모리 상태를 그림으로 묘사하면 와 같이 생성이 된다. 즉 변수 타입만 다를뿐 동일한 객체를 참조하고 있다. 위와 같은 상태에선 B b= new B(); C c= new C(); D d= new D(); E e= new E(); A a1 = b; (가능) A a2 = c; (가능) A a3 = d; (가능) A a4 = e; (가..
상속이란, 하위 클래스(자식 클래스)가 상위 클래스(부모 클래스)의 멤버를 사용할 수 있는 것이다. 즉 부모는 자식에게 자신의 멤버를 제공해준다. 자식은 부모에게 상속 받은것 + 자신의 것을 사용할 수 있다. 상속은 클래스를 재사용하기 때문에 코드의 중복을 줄여준다. 또한 개발의 시간을 단축시킬 수 있어 매우 유용하다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class A { int a = 0; public void method1() { } } class B extends A { public void method1() //부모 메소드 사용 { a = 5;// 부모 필드 변수 사용 } //부모의 메소드를 자식이 재정의함 -> 오버라이딩 } Colored by ..
객체 지향 프로그래밍에서는 객체 외부에서 직접적으로 접근하는 것을 막는다. 왜냐하면 객체의 데이터를 외부에서 마음대로 다룰 경우 무결성이 깨질 수 있기 때문이다. 때문에 객체 지향 프로그래밍에서는 메소드를 통해서 데이터를 변경하는 방법을 선호한다. 데이터는 외부에서 접근할 수 없도록 막고 메소드를 공개해서 외부에서 데이터에 접근하게 하는 방법이다. 이러한 역할을 담당하는 것이 get, set메소드이다(getter, setter 라고도 부른다) setter는 값을 저장(셋팅)하게 유도하는 메소드이다. 반대로 getter는 값을 return받게 해주는 메소드이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ..
라이브러리 클래스를 설계할 때에는 외부 클래스에서 접근할 수 있는 멤버와 접근 할 수 없는 멤버로 구분해서 필드, 생성자, 메소드를 설계하는 것이 바람직하다. 자바는 이러한 기능을 구현하기 위해 접근 제한자를 제공하고 있다. 접근 제한자는 public, protected, dafault, private와 같이 네 가지 종류가 있다. 각 특징은 밑의 표와 같다 클래스 내부 같은 패키지 서브 클래스 다른 패키지 public o o o o protected o o o x default o o x x Private o x x x 말그대로 public은 다 접근 가능하고 protected는 다른 패키지에선 접근이 불가능하고 default는 서브(자식) 클래스와 다른 패키지에서 접근이 불가능하다. 하지만 만약 같은..
같은 패키지에 속하는 클래스들은 아무런 조건 없이 다른 클래스를 사용할 수 있지만 다른 패키지에 속하는 클래스를 사용하려면 주로 import를 사용해서 쓴다. import java.util; 처럼 말이다. 주의할 점은 import문으로 지정된 패키지의 하위 패키지는 import대상이 아니다. 만약 하위 패키지에 있는 클래스들도 사용하고 싶다면 import문을 추가해야한다. 예를들어 com.mycompany.project 패키지를 갖고 오고 싶으면 import com.mycompany.*; 이 아니라 import com.mycompany.project.*; 으로 해야 한다.
가끔 프로그램을 하다 보면 단 하나의 객체만 만들도록 보장해야 하는 경우도 있다. 단 하나만 생성된다고 해서 이 객체를 싱글톤(Singleton)이라고 한다. 이러한 싱글톤을 만드려면 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 한다. 생성자를 외부에서 호출할 수 없도록 하려면 생성자 앞에 private 접근 제한자를 붙여주면 된다. 그리고 자신의 타입인 정적 필드를 하나 선언하고 자신의 객체를 생성해 초기화한다. 자신의 클래스 내부에선 new 연산자로 생성자로 호출이 가능하다. 정적 필드 또한 private 접근 제한자를 붙여 외부에서 필드 값을 사용못하게 막고 대신 외부에서 호출 할 수 있는 getInstance()메소드를 선언하고 객체를 리턴한다 1 2 3 4 5 6 7 8 9..
정적(static)이란 '고정'의 의미를 갖고 있다. 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다. 1 2 3 4 5 6 7 8 class A { static int num = 1; static void amt() { } } class B { A.num; A.amt(); } cs위 static으로 작성 해놓은 변수와 메소드가 정적 멤버이다. 정적 필드와 정적 메소드는 클래스에 고정된 멤버이므로 클래스 로더가 클래스(바이트 코드)를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리된다. 따라서 클래스의 로딩이 끝나면 바로 사용할 수 있다. 이것에 대한 접근은 클래스.필드; 클래스.메소드( 매개값) 으로 호출할 수 있다. 여기서 가장 중요한 특징은..
메소드는 객체의 동작에 해당하는 중괄호 {} 블록이다. 자바는 이러한 메소드를 이용해서 클래스안에서 기능을 동작하게 만든다. 메소드는 리턴타입 메소드 이름 ([매개변수1, 배개변수2..]){ 실행 소스; } 와 같이 만들어진다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Radio { int number; public void setVolume(int volume) { number = volume; } public int getVolume() { return number; } } Colored by Color Scripter cs 위에서 setVolume은 볼륨 값을 설정하는 메소드이다. 그리고 getVolume은 설정된 number 값을 return 해주는 return ..
생성자는 new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다. 객체 초기화란 필드를 초기화하거나, 메소드를 호출해서 객체를 사용할 준비를 하는것이다. 자바에서의 객체는 생성자를 실행시키지 않고서 만들 수 없다. new 연산자에 의해 생성자가 성공적으로 실행되면 힙 영역에 객체가 생성되고 객체 주소가 리턴된다. 모든 클래스에는 생성자가 반드시 존재하며, 하나 이상을 가질 수 있다(오버로딩). 만약 개발자가 클래스 내부의 생성자 선언을 생략했으면 컴파일러는 기본 생성자를 바이트 코드에 자동 추가 시킨다. 예를들어 소스 파일(A.java)에선 class A { } 이면 바이트 코드파일(A.class)에서는 class A { public A() { } } 와 같이 생성..