[학습목표]
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) 동적 바인딩
생성되어 있는 객체 주소를 선조의 객체가 참조해서 후손을 필요에 따라 찾아가는 것을 말함
'🦁멋쟁이 사자처럼 15기 > 3월달 수업 내용 정리' 카테고리의 다른 글
멋쟁이 사자처럼 12회 ( 03 / 13 ) (0) | 2025.03.13 |
---|---|
멋쟁이 사자처럼 11회차 ( 03 / 12 ) (0) | 2025.03.12 |
멋쟁이 사자처럼 9회차 ( 03 / 10 ) (0) | 2025.03.10 |
멋쟁이 사자처럼 8회차 ( 03 / 07 ) (0) | 2025.03.07 |
멋쟁이 사자처럼 7회차 ( 03 / 06 ) (0) | 2025.03.06 |