🦁멋쟁이 사자처럼 15기/3월달 수업 내용 정리

멋쟁이 사자처럼 10회차 ( 03 / 11 )

코딩하는 하마 2025. 3. 11. 16:52

 

[학습목표]

1. 상속(Inheritance)의 개념과 활용을 이해하고, 부모 클래스의 기능을 재사용하여 코드의 중복을 줄일 수 있다.

2. 추상 클래스 (Abstract Class)의 개념을 이해하고, 공통 기능을 정의하여 코드의 일관성을 유지할 수 있다.

3. 다형성 (Polymorphism)을 활용하여 객체를 동적으로 관리하고, 유연한 코드 구조를 만들 수 있다

4. 인터페이스(Interface)를 사용하여 유연한 설계를 구현하고, 다중 구현을 활용할 수 있다.

 


객체

1) 객체와 객체 지향 프로그램 

- 객체란 데이터와 데이터를 처리하는 메서드를 묶은 개념

- 객체 지향 프로그래밍(OOP)은 데이터를 처리하는 메서드를 하나의 프로그램으로 설계하는 방식

      절차 지향: 함수 중심 설계, 순차적 실행 (ex. C, Pascal)

      객체 지향: 이벤트 기반 실행, 클래스와 객체를 통한 코드재사용 (ex. Java, C++)

 

2) 객체 지향 프로그래밍의 특징

- 캡슐화 (Encapsulation): 데이터를 보호하고, 외부에서 직접 접근을 제한

- 상속 (Inheritance) : 기존 클래스를 재사용하여 새로운 클래스를 생성

- 다형성 (Polymorphism) : 하나의 인터페이스로 여러 객체를 다룰 수 있음 (다형성 안에 추상화가 들어감)

- 추상화 (Abstraction) : 불필요한 부분을 숨기고, 중요한 부분만 노출

 

3) 클래스와 객체

클래스 : 객체를 정의하는 틀 ( 클래스 = 필드 + 메소드  -> UserDataType )

               주요 요소 : 멤버 변수 (속성) , 멤버 메소드 (행동) , 생성자 (초기화)

객체 : 클래스를 기반으로 생성된 인스턴스 

 

4) 객체 생성과 사용

- new 키워드를 사용하여 클래스 인스턴스를 생성

- 참조 변수 활용하여 객체 조작

- this 키워드를 사용하여 멤버 변수와 지역 변수 구분 ( this = 현재 Object를 지칭하는 것 )

 

5) 객체 배열 

하나의 클래스에서 여러 개의 객체를 배열로 관리 

일반 배열과 다르게 객체의 참조 ( 주소 ) 만 저장 

객체 생성 후 각 배열 요소에 개별적으로 new 연산자를 사용해야 함

 

//Person.class
Person[] people = new Person[3];
        people[0] = new Person("홍길동", 25);
        people[1] = new Person("이순신", 30);
        people[2] = new Person("강감찬", 35);

 


 

상속 

 

- 기존 클래스(부모 클래스)의 기능을 재사용하고, 새로운 기능을 추가하는 기법

- 부모 클래스(Super Class)와 자식 클래스(Sub Class) 관계 형성

- extends 키워드를 사용하여 클래스 상속 가능

 

1) 인터페이스와 클래스를 가지고 단일 상속과 다중 상속 살펴보기

 

class : 생성자 o , interface : 생성자 x

 

extends : class -> class ( 단일 상속 ) interface -> interface (다중 상속 )

implements : class -> interface (다중 상속 )

interface -> class (x)

 

public class Vector <E>

extends AbstractList <E>

implements List <E> , RandomAccess , Cloneable , Serializable

 

Vector (class) -> Abs (class )

                      -> 그 외 다른 인터페이스들 (List , RandomAccess ,Cloneable , Serializable

 

 

위 그림을 통해 클래스와 인터페이스 간의 상속 관계를 볼 수 있다.

 

2) super과 this 

super : 부모 클래스 멤버 ( 변수 , 메소드 )접근 시 사용

this : 현재 인스턴스 가리킬 때 사용

super () : 부모 클래스 생성자 호출

this() : 현재 클래스의 다른 생성자 호출

 

ex)

class Parent {
    Parent() {
        System.out.println("부모 생성자");
    }
}

class Child extends Parent {
    Child() {
        super(); // 부모 생성자 호출
        System.out.println("자식 생성자");
    }
}

 

3) 오버라이딩 

부모 클래스의 메소드 -> 자식 클래스에서 재정의하는 기법

메소드 이름 , 반환형 , 매개변수 동일해야 함

@Override 어노테이션을 사용하여 컴파일러가 검증 가능

 

ex) 

class Parent {
    void show() {
        System.out.println("부모 클래스 메서드");
    }
}

class Child extends Parent {
    @Override
    void show() {
        System.out.println("자식 클래스 메서드");
    }
}

 

특징 ) 

static , final , privaet 메소드는 오버라이딩 불가능

접근 지정자는 부모 메소드보다 더 넓거나 같아야 함

      - 접근 제한자

         - private 해당 클래스 내부에서만 접근 가능

         - default 같은 패키지 내에서만 접근 가능

         - protected 같은 패키지 + 자식 클래스에서 접근 가능

         - public 모든 클래스에서 접근 가능

 

 

4) static과 final 키워드 살펴보기 

- static 변수와 메소드

클래스 로딩 시 메모리에 단 한 번 할당됨

객체 생성 없이 클래스명으로 접근 가능 (클래스명.변수명)

  

ex)

public class StaticInitTest {

	static int i = 10;
	static {
		System.out.println("Static i=" + i++);
	}

	public static void main(String[] args) {
		System.out.println("Main  " + StaticInitTest.i);
		for ( int i =0 ;i<=5 ;i++) {
			new StaticInitTest();
		}
		System.out.println("Main " +StaticInitTest.i);
	}
}

 

 

 

- final 키워드 

변수 : 값 변경 불가 (상수화)

메소드 : 오버라이딩 불가

클래스 : 상속 불가

 

ex) 

final class FinalClass {} // 상속 불가

class Parent {
    final void method() {} // 오버라이딩 불가
}

 

5) 동적 바인딩 

생성되어 있는 객체 주소를 선조의 객체가 참조해서 후손을 필요에 따라 찾아가는 것을 말함