230330 - java(13)

팝콘·2023년 3월 30일

Java

목록 보기
12/17

중간 정리

  1. 클래스의 상속
  • 부모 클래스를 상속받아서 자식 클래스를 작성하는 것
  • 목적
    1) 코드의 중복 제거 : 자식 클래스들의 공통속성을 부모 클래스로 작성하면, 자식 클래스에서는 코드 작성 없이 사용할 수 있다.
    2) 생산성의 향상 : 부모 클래스를 상속받아서 자식 클래스를 빠르게 작성할 수 있다.
    3) 관련있는 여러 클래스들을 같은 종류로 묶을 수 있다.
    - Car를 상속받아서 작성한 다양한 자동차 객체들은 전부 Car 타입이다.

  1. 클래스 형변환
  • 자식객체를 부모타입의 참조변수로 참조할 수 있는 것이다.
  • 클래스 형변환이 발생하면, 생성한 객체를 참조한는 것이 아니라 생성한 객체의 부모객체 중에서 참조변수의 타입과 일치하는 객체를 참조하게 된다.
  • 참조변수의 타입에 따라서 실행할 수 있는 메소드가 달라진다.
    - 생성한 객체에서 참조변수가 실제로 참조하는 객체 및 그 부모객체에 정의된 것만 사용할 수 있다.
  • 목적
    1) 여러 객체를 하나의 타입으로 관리할 수 있다.
    - Car타입의 객체로 소나타 객체, 캐스퍼 객체, 제네시스 객체를 참조할 수 있다.
    - Car타입의 배열로 소나타 객체, 캐스퍼 객체, 제네시스 객체를 저장하루 수 있다.
    - Car타입의 매개변수는 소나타객체, 캐스퍼객체, 제네시스객체를 전달받을 수 있다.
    public void test(Car car) {...}
    x.test(new 캐스퍼());
    x.test(new 제네시스());

-Car타입의 반환타입이 정의된 메소드는 소나타객체, 캐스퍼객체, 제네시스객체를 반환값으로 반환할 수 있다.

    public void Car test() {
    	수행문;
        return 소나타():
    }

2) 타입으로 객체의 종류를 제한할 수 있다.
- 매개변수의 타입을 특정타입으로 지정함으로써 해당 종류의 객체만 전달받을 수 있다.

    // Phone종류 객체만 전달받는다.
    Public void test(Phone p) {...}

    // 인터넷, 게임 등이 지원되는 SmartPhone종류 객체만 전달받는다.
    Public void test(SmartPhone p) {...}
    Public void test(Galaxy p) {...}

  1. 메소드 재정의
  • 부모클래스, 부모인터페이스에 정의된 메소드를 자식클래스에 똑같은 이름을 다시 정의하는 것
    1) 부모클래스에서 구현한 내용이 자식클래스에서 맞지 않아서 자신에게 적합한 동작으로 메서드를 재정의할 수 있다.
    2) 부모인터페이스에서 기능에 대한 명세만 정의되어 있을 때, 각각의 자식클래스에서 자신에게 적합한 동작으로 메소드를 재정의할 수 있다.
  • 목적
    1) 자식객체로의 강제 클래스 형변환이 불필요하다.
    - 클래스 형변환 되어서 부모객체를 참조하고 있더라도 실제 생성된 자식객체에서 재정의된 메소드를 실행되게 할 수 있다.
    - 구체적인 자식객체의 타입을 모르더라도 그 자식객체에 재정의된 메소드를 실행할 수 있다.
    2) 다형성을 발휘시킬 수 있다.
    - 같은 사용법으로 실행하더라도 참조하는 객체가 달라지면 실행결과가 다르게 발휘되게 할 수 있다.

  1. 추상화
  • 여러 자식클래스들이 구현할 기능을 추상화(메소드 선언만 있고, 구현부가 없이 작성하는 것)하고 추상화된 기능을 구체화시키는 것은 자식클래스에서 하게 하는 것이다.
  • 추상클래스나 인터페이스에서 자식클래스에 구현할 기능을 추상화한 추상메소드를 작성하고, 자식 클래스에서 해당 추상메소드를 재정의하게 한다.
    - 같은 사용법으로 실행하더라도 참조하는 객체가 달라지면 실행결과가 다르게 발휘되게 할 수 있다.
  • 목적
    1) 모든 자식객체들이 비슷한 기능들을 같은 사용법(같은 반환타입, 같은 메소드명, 같은 매개변수)으로 구현하게 한다.
    2) 다형성을 발휘시킬 수 있다.

  1. 인터페이스
  • 자식클래스에서 구현할 기능에 대한 명세를 제공한다.
  • 특정 인터페이스를 구현한 모든 구현클래스는 정부 동일한 명세를 구현한 것이기 때문에 사용법(같은 반환타입, 같은 메소드명, 같은 배개변수)이 동일하다.

2. 내부 클래스

  • 내부 클래스는 클래스 내에 선언된 클래스다. 클래스에 다른 클래스를 선언하는 이유는 두 클래스가 서로 긴밀한 관계에 있기 때문이다.
  • 내부 클래스는 외부 클래스를 제외하고는 다른 클래스에서 잘 사용되지 않는 것이어야 한다.

내부 클래스의 장점

  • 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
  • 외부에 불필요한 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다.(캡슐화)

멤버(인스턴스) 내부클래스

  • 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스멤버처럼 다루어진다.

  • 내부클래스를 포함하고 있는 외부클래스의 모든 구성요소(멤버변수, 클래스변수, 멤버베소드, 클래스메소드)를 사용할 수 있다. 또한 외부클래스의 은닉화된 필드, 은닉화된 메소드도 사용할 수 있다.

  • 외부클래스의 객체가 생성된 후에 사용할 수 있다.

  • static 변수와 static 메소드는 포함할 수 없다. 내부클래스의 멤버메소드에서 외부클래스의 은닉화된 필드, 은닉화된 메소드도 사용할 수 있다.

public calss A {
	private int x;
    public void m1() {
    	수행문;
    }
    
    // 인스턴스 내부클래스
    public class B {			
    	int y;					
        public void m2() {		
        	수행문			
        }
    }
}

static 내부 클래스

  • 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 static멤버처럼 다루어진다.

  • 외부 클래스를 객체생성여부와 상관없이 클래스변수나 클래스메소드처럼 즉시 사용할 수 있다.

  • 외부 클래스의 구성요소 중에서 클래스변수와 클래스메소드만 사용할 수 있다.

  • static 내부 클래스는 외부 클래스의 객체 생성하지 않고도 사용할 수 있기 때문에, 객체 생성후에만 사용할 수 있는 외부 클래스의 멤버변수, 외부클래스의 멤버메소드에 사용할 수 없다.

public calss A {
	private int x;
    public void m1() {
    	수행문;
    }
    
    // 정적(static) 내부클래스
    public static class B {			
    	int y;					
        public void m2() {		
        	수행문			
        }
    }
}

지역(local) 내부클래스

  • 외부 클래스의 메서드나 초기화블럭 안에 선언되며, 선언된 영역 내부에서만 사용될 수 있다.
  • 내부 클래스에 클래스변수, 클래스메서드는 정의할 수 없다.
  • 내부 클래스의 메서드에서 외부 클래스 모든 필드, 모든 메서드를 사용할 수 있다.
  • 내부 클래스가 정의된 메서드의 매개변수, 지역변수의 경우 메서드가 실행되는 동안 값이 변하지 않는 변수의 값만 사용할 수 있다.
public calss A {
	private int x;
    public void m1() {
    	수행문;
    }
    public void m2() {
    	int y = 10;
        
        //지역 내부 클래스
    	class B {
        	int z;
            public void m3() {
            	수행문;
            }
        }
    }
}

익명 내부클래스

  • 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스다. (일회용)
  • 별도의 클래스를 만들고 싶지 않을 때 사용된다.
  • 이름이 없기 때문에 생성자를 가질 수 없다.
  • 익명 내부클래스는 부모역할을 하는 부모 인터페이스 혹은 부모클래스가 필요하다.
  • 단일 상속만 가능하다. 하나의 클래스를 상속받으면서 인터페이스를 구현하거나, 둘 이상의 인터페이스를 구현할 수 없다.
  • 익명 내부클래스는 익명객체를 생성할 때 활용한다.
  • 익명 내부클래스는 클래스의 선언과 객체의 생성이 동시에 이루어진다.
형식) 
	부모 인터페이스 정의
		public interface Pen {
			void draw();
		}	

	익명 내부클래스 정의
		Pen pen1 = new Pen() {
			public void draw() {
				수행문;
			}
		};
profile
터짐

0개의 댓글