728x90
반응형
추상 클래스
추상적인 개념을 표현하고, 완성되지 않은 메서드를 가지고 있는 클래스
- 메서드가 미완성되어 있기 때문에 추상 클래스로는 개체를 생성할 수 없다.
- 추상 클래스는 주로 상속관계에서 추상적인 개념을 나타내기 위한 목적으로 사용되고, 단일 상속이 가능하다.
- 추상 메서드를 하나라도 가지고 있으면 추상 클래스가 된다.
- 추상 메서드 : 동작 방식을 결정할 수 없을 때, 확정할 수 없는 경우, 동작부분을 기술하지 않고 비워두는 메서드
- 메서드 오버라이딩이 빈번하게 사용될 것이 예측될 경우에도 사용한다.
- 예) 동물(animal) 클래스를 구형하려고 할 때 동물에 대한 개념은 알고 있지만 구체적으로 어떤 동작을 하는지 알 수 없기 때문에 구체적인 동작을 구현하기 어렵다. move()라는 메서드를 정의할 경우, 동물이 움직인다는 것은 알지만 구체적으로 날아다니는지 기어다니는지는 알 수 없다. 이런 경우에 animal은 추상 클래스로 구현한다.
- 추상 클래스의 예) 동물, 포유류, 어류, 조류, 도형 등
- 추상 메서드의 대표적인 예) 쓰레드의 run() 메서드

public abstract class Animal {      //추상클래스 : 추상메서드를 가지고 있는 클래스
      public abstract void move();   // ';'으로 종료됨을 유의! , 추상메서드 정의
      ...
 };





인터페이스(Interface)
- 인터페이스는 클래스가 아니다. interface 키워드로 선언한다.
- 인터페이스는 객체와 객체 사이의 상호 작용을 나타낸다.
다중 상속의 기능을 구현하려고 할 때, 인터페이스를 사용한다.
- 인터페이스는 추상 메서드만 가질 수 있고, 일반 메서드는 가질 수 없다.
- 인터페이스는 static final형태의 상수만 가질 수 있다. 변수는 가질 수 없다.
- 인터페이스는 데이터는 표현할 수 없고 메서드(함수)만 표현이 가능하다.
- 이미 클래스 상속을 받고 있더라도 인터페이스의 상속을 받는 것이 가능하다.
- 인터페이스도 추상클래스처럼 객체를 생성할 수 없다. 다른 클래스에 의해서 구현(implements) 하여 사용한다.
- 추상 메서드는 자식 클래스에서 반드시 구현해야 한다.

<인터페이스와 추상클래스의 구분>
 - 인터페이스 : 모든 메서드가 추상메서드이면 인터페이스로 구현, 다중 상속
 - 추상클래스 : 여러개의 메서드 중 일부가 추상메서드이면 추상클래스로 구현, 단일 상속

<인터페이스의 사용>
 - 인터페이스의 선언 : interface 인터페이스이름
 - 인터페이스의 구현 : class 클래스이름 implements 인터페이스이름
 
   public interface 인터페이스_이름 {
        반환형 추상 메서드1(...) ;
        반환형 추상 메서드2(...) ;       //인터페이스 안에는 추상 메서드들이 정의된다.
         ...
   }
                                                                                                                                             
  public class 클래스_이름 implements 인터페이스_이름 {
        반환형 추상 메서드1(...) {
         ...
        }
        반환형 추상 메서드2(...) {
         ...
        }                               //인터페이스를 구현하는 클래스는 추상 메서드의 몸체를 구현하여야한다.
   }



<여러 인터페이스를 동시에 구현>



인터페이스와 다중 상속
- 만약, 클래스에서 다중상속이 허용된다면 객체를 생성하여 인스턴스 변수에 접근할 때 obj.x는 SuperA 클래스의 멤버인지 SuperB 클래스의 멤버인지 구분이 안된다. 그래서 자바에서 클래스는 단일 상속만 허용한다.
- 다중상속의 효과를 구현하고 싶다면, 인터페이스를 구현하면서 동시에 다중 상속을 하면된다.




<상수 정의>
  인터페이스에서는 변수는 사용할 수 없고, 상수만 사용할 수 있다.


728x90
반응형
728x90
반응형

상속

 상속의 장점

 - 상속을 통하여 기존 클래스의 필드와 메소드를 재사용

 - 기존 클래스의 일부 변경도 가능

 - 상속을 이용하게 되면 복잡한 GUI프로그램을 순식간에 작성

 - 상속은 이미 작성된 검증된 소프트웨어를 재사용

 - 신뢰성 있는 소프트웨어를 손쉽게 개발, 유지 보수

 - 코드의 중복을 줄일 수 있다.

 

  class SubClass extends SuerClass (extends:상속을 의미한다. 수퍼클래스를 확장하여 서브 클래스를 작성한다는 의미) (SuperClass: 부모클래스)

 {

        ... //추가된 메소드와 필드

  }

 

상속의 정의

 기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것

 두 클래스를 부모와 자식으로 관계를 맺어주는 것

 자식은 부모의 모든 멤버를 상속받는다.

 자식의 멤버개수는 부모보다 작을 수 없다. (같거나 많아야 한다.)

 

클래스간의 관계 - 상속관계

 공통 부분은 부모 클래스에서 관리하고, 개별 부분은 자식 클래스에서 관리한다.

 부모의 변경은 자식에게 영향을 미치지만, 자식의 변경은 부모에게 영향을 주지 않는다.

 

 

단일상속

 java는 단일상속만을 허용한다. 하지만 인터페이스를 사용하여 다중상속의 효과를 낼 수 있다. ( C++은 다중상속 허용 )

    class TVCR extend TV,VCR {

       ...

    }   //이와 같은 표현은 허용하지 않는다.

 

 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.

<상속과 포함>

 

 

상속에서 접근 지정자

 private (X)

 protected (O)

 package (O)

 public (O)

 

<접근 지정자>

 

 

 

 

메서드 재정의 (오버라이딩)

 메서드 재정의 : 자식 클래스가 필요에 따라 상속된 부모의 메서드를 변경하여 사용하는 것

 주의할점 :

 - 메서드의 헤더(머리부분)은 그대로 두고, 바디(몸체부분)만 교체하는 것이다.

 - 메서드의 헤더 부분은 부모 클래스의 헤더와 동일해야 한다. (메서드 이름, 반환타입, 매개변수의 개수와 데이터타입이 일치해야 한다.)

 - 메서드가 public으로 선언되어 있는 경우에만 재정의가 가능하다. private메서드는 오버라이딩할 수 없다.

 - 부모 클래스의 메서드보다 더 좁은 범위의 접근제어자로 변경할 수 없다.

   예를 들어, 부모 클래스의 메서드가 protected로 선언되어 있는 경우에 자식클래스의 재정의 메서드는 protected나 public으로만 선언 가능하다.

 

<메서드오버라이딩>

 

 

 

재정의 (오버라이딩)와 중복정의 (오버로딩)의 차이점

 메서드 오버라이딩(재정의) : 부모클래스를 상속받은 자식클래스에서 부모의 메서드를 변경하여 사용하는 것

 메서드 오버로딩(중복정의) : 같은 클래스 안에서 이미 정의된 메서드를 변경하여 사용하는 것

 

<오버로딩>

 

 

 

super 키워드

 - 상속관계에서 부모 클래스의 변수나 메서드를 참조하기 위해 사용되는 키워드

 - super를 사용하여 부모클래스의 변수나 메서드를 호출할 수 있다.

 - 메서드를 재정의할 때, 부모클래스의 메서드를 완전히 다른 것으로 바꾸는 경우보다 내용의 추가하는 경우가 많다.

   이런 경우에 super 키워드를 사용하여 부모 클래스의 메서드를 호출한 뒤 필요한 부분을 추가하여 사용하면 된다.\

 

 

 

<super생성자>

 

 

 

Object클래스

 - 부모클래스를 정의하지 않으면 자동으로 Object클래스가 부모클래스가 된다.

 - 모든 클래스는 Object 클래스에 정의된 11개의 메서드를 상속받을 수 있다.

 - Object 클래스는 java.lang 패키지에 들어 있으며 자바 클래스 계층 구조에서 맨 위에 위치하는 최고의 조상 클래스

 

Object의 메서드

 protected Object clone()

 -> 객체 자신의 복사본을 생성하여 반환한다.

 public boolean equals(Object obj)

 -> obj가 이 객체와 같은지를 나타낸다.

 protected void finalize()

 -> 가비지 콜렉터에 의하여 호출된다.

 public final Class getClass()

 -> 객체를 생성한 클래스 정보를 반환한다.

 public int hashCood()

 ->객체에 대한 해쉬 코드를 반환한다.

 public String toString()

 -> 객체의 문자열 표현을 반환한다.

 

 

getClass()메서드

 - 객체가 어떤 클래스로 생성되었는지에 대한 정보를 반환하는 메서드

>> getClass

 

 

 

equals()메서드

 - 두개의 객체를 비교하여 같으면 ture를 반환하는 메서드

 - equals() 메서드는 재정의(오버라이딩)하여 사용해야 한다.

>>equals

 

 

 

toString()메서드

 - Object 클래스의 toString() 메서드는 객체가 가지는 값을 문자열 형태로 반환하는 메서드, 객체가 생성되면 자동 호출된다. 오버라이딩하여 사용한다.

>>tostring

 

 

 

final 클래스와 final 메서드

 - 클래스에 final 키워드를 붙이면 상속할 수 없는 클래스

 - 메서드에 final 키워드를 붙이면 오버라이딩할 수 없는 메서드

>>Final

728x90
반응형
728x90
반응형

제어자(modifier)

 - 클래스, 멤버변수, 메서드의 선언부에 주로 사용된다

 - 하나의 대상에 여러 개의 제어자를 조합하여 사용할 수 있으나, 접근제어자는 한번에 4개중 하나만 선택하여 사용할 수 있다. 즉, 하나의 대상에 대하여 public과 private를 동시에 사용할 수 없다.

 - 제어자는 크게 접근 제어자와 그 외의 제어자로 나뉜다.


접근제어자 :: public, protected, default, private

그         외 :: static, final, abstract, native, transient, synchronized, volatile, strictfp



static (클래스의, 공통적인 제어자)

 static이 사용될수 잇는곳 :: 멤버변수, 메서드, 초기화 블럭


멤버변수 -> 모든 인스턴스에 공통적으로 사용되는 클래스변수가 된다.

                  클래스변수는 인스턴스를 생성하지 않고도 사용 가능하다.

                  클래스가 메모리에 로드될 때 생성된다.

메서드 -> 인스턴스를 생성하지 않고도 호출이 가능한 static메서드가 된다.

               static메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없다.




final (마지막의, 변경될 수 없는 제어자)

 final이 사용될 수 있는 곳 :: 클래스, 메서드, 멤버변수, 지역변수


클래스 -> 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. 그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.

메서드 -> 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.

멤버변수 -> 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.

지역변수 -> 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.




접근 제어자 (access modifier)

 멤버 또는 클래스에 사용되어, 외부로부터의 접근을 제한한다.

 접근 제어(access control) :: 다른 클래스가 특정한 필드나 메서드에 접근하는 것을 제어하는 것


접근 제어자가 사용될 수 있는 곳 :: 클래스, 멤버변수 메서드, 생성자

 private -> 같은 클래스 내에서만 접근이 가능하다.

 default -> 같은 패키지 내에서만 접근이 가능하다.

 protected -> 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.

 public -> 접근 제한이 전혀 없다.




접근 제어의 종류

 클래스의 접근 제어

 - public : 다른 모든 클래스가 사용할 수 있는 공용 클래스

 - package(default) : 같은 패키지 안에 있는 클래스들만 사용할 수 있는 클래스


 멤버의 접근 제어

 


 

<접근 제어>



728x90
반응형
728x90
반응형

생성자에서 다른생성자 호출하기 - this()

▶ 같은 클래스의 멤버들 같에 서로 호출할 수 있는 것처럼 생성자끼리도 서로 호출이 가능하다.

단, 다음의 두 조건을 만족시켜야 가능하다.

- 생성자의 이름으로 클래스 이름 대신 'this'를 사용한다.

- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.





<생성자 호출 this>






참조변수 this

  - 인스턴스 자신을 가리키는 참조변수

  - 현재 클래스의 객체를 가리키는 참조변수




<참조변수 this>






<생성자 this() 와 참조변수 this>

 






정적 메서드(static method)

 - 객체를 생성하지 않고 사용할 수 있는 메서드

 - 정적 메서드에서는 인스턴스 변수와 인스턴스 메서드에 접근할 수 없다. 인스턴스 변수와 메서드는 객체를 생성해야만 접근가능하기 때문이다.

 - 정적 메서드에서는 정적 변수와 지역 변수만 사용할 수 있다.

 - 정적 메서드는 this키워드를 사용할 수 없다. this가 참조할 객체가 없기 때문이다.


예)

 - main()메서드 : public static void main()

 - Math 클래스에 들어있는 각종 수학 메서드들 : Math.sqrt(9.0)



<정적 메서드>​

728x90
반응형
728x90
반응형

생성자(constructor)

 - 객체가 생성될 때에 변수에게 초기값을 제공하고 필요한 초기화 절차를 실행하는 메서드

 - 인스턴스 변수를 초기화하는것이 목적이다. 하나의 변수를 동시에 여러개의 값으로 초기화할 수 있다.

 - 일반 객체르,ㄹ 생성하였을 경우에는 아무것도 없는 맨얼굴의 객체를 생성하는 것이고, 생성자를 사용하면 꾸며진 객체를 생성할 수 있고 또한 매개변수에 따라서 서로 다른 모양의 객체를 생성할 수 있다.


생성자의 특징

 - 인스턴스가 생성될 때마다 호출되는  '인스턴스 변수의 초기화 메서드'

 - 인스턴스 변수의 초기화 또는 인스턴스 생성시 실행할 작업에 사용

 - 몇가지 조건을 제외하고는 메서드와 같다.

 - 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.

 - 생성자 역시 메서드처럼 클래스 안에 선언되고 구조도 메서드와 유사하지만, 리턴값이 없다는 점이 다르다. 리턴값이 없어도 void키워드는 사용하지 않는다.


생성자의 조건

 - 생성자의 이름은 클래스의 이름과 같아야 한다.

 - 생성자는 리턴값이 없다. 하지만 void를 쓰지 않는다.


      클래스이름 (타입 변수명, 타입 변수명, ...) {

                인스턴스 생성시 수행될 코드

                주로 인스턴스 변수의 초기화 코드를 적는다.

      }

            ↓↓↓

     class Card {

             Card() {                                      //매개변수가 없는 생성자

                   인스턴스 초기화 작업

              }

             Card(String kind, int number) {     //매개변수가 있는 생성자

                   인스턴스 초기화 작업

             }

     }



<생성자>




디폴트 생성자(default constructor)

 - 매개변수가 없는 생성자

 - 클래스에 생성자가 하나도 없으면 컴파일러가 기본 생성자를 추가한다.

    ( 생성자가 하나라도 있으면 컴파일러는 기본 생성자를 추가하지 않는다.)

 

형식 : 클래스이름() { }

 //컬파일러에 의해 추가된 Card클래스의 기본생성자. 내용이 없다.

 Card() { }

※ 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.


<디폴트 생성자 1>




 <디폴트 생성자 2>

생성자가 하나라도 정의되어 있으면 디폴트 생성자는 만들어지지 않는다.




<디폴트 생성자 3>







매개변수가 있는 생성자



※ 인스턴스를 생성한 후 인스턴스 변수의 값을 변경하는 것보다, 매개변수를 있는 생성자를 사용하는 것이 코드를 보다 간결하고 직관적으로 만든다.


<매개변수 있는 생성자>

728x90
반응형

+ Recent posts