스프링 입문을 위한 자바 객체 지향의 원리와 이해 - Chapter 04. 자바가 확장한 객체 지향

김광현·2022년 12월 29일
0

이번 챕터에서 다룰 내용이 단어적으로 보면 꽤많습니다.

하지만 한번에 알아두면 좋을 것 같아 조금 길더라도 한 곳에 몰아서 정리하려합니다.

Abstract - 추상메서드, 추상클래스

Abstract는 2가지의 의미가 있습니다.

대상이 추상메서드일때의 Abstract는?

클래스 내의 추상메서드가 선언 되어있음을 표시하는 역할입니다.
다시말해, 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메서드를 뜻합니다.

그렇다면 어째서 추상메서드를 쓸까?

추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함입니다.

문법은 어떻게?

abstract 리턴타입 메서드명();

//선언부만 있고 구현부가 없다는 의미로 선언부 끝에 ;를 추가합니다.

대상이 추상클래스일때의 Abstract는?

실체클래스의 공통적인 부분(변수,메서드)를 추출해서 선언한 클래스입니다.

실체클래스? 이건 또 무엇?

몹시 쉬운 개념입니다.
"객체를 직접 생성할 수 있는 클래스"

추상클래스의 유의할점

추상클래스는 실체 클래스의 공통적인 부분을 추출해 어느정도 규격을 잡아놓은 추상적인 클래스입니다.
그래서 실체클래스 실제 객체를 생성할 정도의 구체성을 가지는 반면, 추상클래스는 아직 메서드와 내용이 추상적이기 때문에 객체를 생성할 수 없게 만들었습니다.

다시말해, 추상클래스의 객체를 생성해봤자 추상클래스는 아무 일도 하지 못하기 때문에 객체를 생성하지 못하도록 한다.

그렇다면 어째서 추상클래스를 쓸까?

객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메소드의 집합을 정의할 수 있도록 해줍니다.

문법은 어떻게?

abstract class 클래스이름 {
	...
    abstract 리턴타입 메서드명();
    ...
}

생성자 [Constructor]

생성자란?

생성자는 new 연산자를 통해서 인스턴스를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 메소드입니다.

역할은?

생성자는 인스턴스 변수(필드 값등)을 초기화 시키는 역할을 합니다.

인스턴스를 생성할 때 반드시 호출? 아직 안만들었는데?

라는 걱정을 한다면 의미없는 걱정입니다.
클래스를 만들때 생성자를 생략한다면 컴파일러가 자동적으로 기본 생성자(Default Constructor)를 생성해주기때문입니다.

	public 클래스이름(){}

여기서 유의할점

만약 인자가 있는 생성자를 하나라도 만든다면 자바는 기본 생성자를 만들어 주지 않습니다.

문법은 어떻게?

public 클래스이름(매개변수) {
	...
}

스태틱 블록 (static block)

스태틱 블록이란?

클래스가 로딩되고 클래스 변수가 준비된 후 자동으로 실행되는 블록을 뜻합니다. = 시작프로그램
추가로 한 클래스 안에 여러 개의 static 블록이 존재 가능합니다.

역할은?

주로 클래스 변수를 초기화 시키는 코드를 씁니다.

문법은 어떻게? (예시)

static class 클래스명 {
	static 변수타입 변수명 = A;	//예시로 변수 타입이 String이라 치겠습니다.
    static {
    	System.out.println("static1");
        변수명 = B;
    }
    static {
    	System.out.println("static2");
        변수명 = C;
    }
}

public static void main(String[] args) {
	클래스명.변수명 = D;
    System.out.println(클래스명.변수명);
}


//실행결과....
//static1
//static2
//D

Final

Final이란?

변수, 메서드, 클래스에서 선언이 가능하며 선언 시 그 필드는 더 이상 수정이 불가능 하다는 의미를 갖습니다.

문법은 어떻게? (예시)

	//Final 변수일시
    class 클래스명 {
    	final 변수타입 변수명 = A;
        public void 메서드명() {
        	변수명 = B;
        }
    }
    
    //컴파일 에러
    //변수명 = B; 수정 불가
	//Final 메서드일시
    class 클래스명 {
    	final void 메서드(){}
    }
    
    class 클래스명2 extends 클래스명 {
    	void 메서드(){}
    }
    
    //컴파일 에러
    //오버라이딩 금지
	//Final 클래스일시
    final class 클래스명 {}
    class 클래스명2 extends 클래스명{}
    
    //컴파일 에러
    //Final 클래스는 상속이 불가능

instanceof 연산자

instanceof 란?

인스턴스는 클래스를 통해 만들어진 객체입니다.
instanceof 연산자는 만들어진 객체가 특정 클래스의 인스턴스가 맞는지 확인해주는 연산자입니다.

반환값은?

object가 type이거나 type을 상속받는 클래스라면 true를 리턴하고 아니면 false를 리턴한다.

문법은 어떻게? (예시 및 예제)

class 대학{}

class 학과 extends 대학{}

public class InstanceofTest {
    public static void main(String[] args){
        대학 대림 = new 대학();
        학과 컴정 = new 학과();

        System.out.println( 대림 instanceof 대학 );  // true
        System.out.println( 컴정 instanceof 대학 );   // true
        System.out.println( 대림 instanceof 학과 );   // false
        System.out.println( 컴정 instanceof 학과 );   // true
    }
}

패키지 [package]

package란?

하나의 클래스 안에서 같은 이름의 클래스들을 사용하기 위한 방법이라고 할 수 있습니다.
다시 말해 namespace을 만들어주는 역할을 합니다.

namespace는 무엇?

많은 클래스를 다루어야 하는 대규모 프로그램을 작성하는 경우
이름이 같은 클래스를 사용해야 하는 상황이 있습니다.
이렇게 패키지에 의해 나뉘어진 클래스의 이름의 모임을 일컬어 'namespace' 입니다.

문법은 어떻게?

package 디렉터리

인터페이스 [interface], implements

interface란?

다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미합니다.

역할은?

자식 클래스가 여러 부모 클래스를 상속받을 수 있다면, 다양한 동작을 수행할 수 있다는 장점을 가지게 될 것입니다.

하지만 클래스를 이용하여 다중 상속을 할 경우 메소드 출처의 모호성 등 여러 가지 문제가 발생할 수 있어 자바에서는 클래스를 통한 다중 상속은 지원하지 않습니다.

하지만 다중 상속의 이점을 버릴 수는 없기에 자바에서는 인터페이스라는 것을 통해 다중 상속을 지원하고 있습니다.

문법은 어떻게?

접근제어자 interface 인터페이스명 {
	public static final 변수타입 변수명 = 값;
    ...
    public abstract 메소드명(매개변수목록);
    ...
}

implements 란?

interface를 상속하기 위해 사용하는 키워드입니다.

유의할점

implements의 가장 큰 특징은 부모의 메소드를 반드시 오바라이딩(재정의)해야 합니다.

문법은 어떻게?(예시)

public class 클래스명 implements 인터페이스명1, 인터페이스명2{ 추상메서드들.. }

this

this란?

인스턴스가 바로 자기 자신을 참조하는 데 사용하는 변수입니다.

문법은 어떻게?(예제 및 예시)

class 학생정보 {
    private String name;
    private int stunum;
    private String carrer;
    private int phone;

    학생입력(String name, int stunum, String carrer, int phone) {
        this.name = name;
        this.stunum = stunum;
        this.carrer = carrer;
        this.phone = phone;
    }
    ...
}

super

super란?

자식 클래스에서 상속받은 부모 클래스의 멤버변수를 참조할때 사용합니다.

문법은 어떻게?(예제 및 예시)

class 테스트 {
	public static void main(String[] args) {
		테스트3 test = new 테스트3();
		test.printMethod();
	}
}

class 테스트2 {
	int x = 10;
}

class 테스트3 extends 테스트2 {
	int x = 20;

	void printMethod() {
		System.out.println("x=" + x);
		System.out.println("this.x=" + this.x);
		System.out.println("super.x=" + super.x);
	}
}


//x=20
//this.x=20
//super.x=10

느낀점 및 알게된점

많이 쓰는 키워드들이 한 챕터에 몰려있어 괜히 Ep로 나눴다가는 헷갈릴것같아 한곳에 몰아넣어봤습니다...만
확실히 글이 길어지다보니 내용이 부실한게 눈에 밟힙니다.
"요약정리"가 메인인 글이긴 하지만, 앞으로 써야할 키워드이기 때문에 추후 놓친점을 알게된다면 계속 수정하겠습니다.

해당 내용은 스프링 입문을 위한 자바 객체 지향의 원리와 이해를 참고하여 작성되었습니다.

profile
대림대학교 컴퓨터정보학부

0개의 댓글