본문 바로가기

Programming 언어/JAVA

8. 객체 간 상속, 객체 배열 및 ArrayList, 캡슐화

1. 클래스 상속

새로운 클래스를 정의 할 때 이미 구현된 클래스를 상속받아서 속성이나 기능을 확장하여 구현

(이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현해야할 때 기존 클래스를 상속)

상속의 문법

class B extends A {}

-> 이때 'A' 자리에는 단 하나의 클래스만 올 수 있다.(자바는 단일 상속만을 지원)

상속 활용한 멤버쉽 클래스 구현하기

참고로, private로 되어 있다면 상속 불가 -> 하위 클래스에서 접근 가능하지만 외부 클래스에서 접근 불가한 protected  사용하라!!

이렇게 상위 클래스를 구현해놓고 하위 클래스인 VIP 클래스를 만든다면

상속 X

상속으로 구현 X

멤버 변수를 하나하나 다시 구현해야하는게 참 번거롭다. 이때 상속을 이용하자!

상속 O

상속 사용

이렇게 간단히 나타내기가 가능

BUT, 여기서 customerGrade 부분이 오류가 나는 걸 볼 수 있는데

그 이유는 상위 클래스에서 private으로 정의되었기 때문이다.

-> 상속 관계 에서는 상위 클래스의 변수들을 많이 사용하므로 protected를 많이 사용함

(protected는 하위 클래스에서 접근 가능하지만 외부 클래스는 불가하므로)

2. 객체 배열 선언과 구현

기본 자료형 배열은 선언과 동시에 배열의 크기만큼의 메모리가 할당되지만

체 배열의 경우엔 요소가 되는 객체의 주소가 들어갈(4, 8바이트) 메모리만 할당(null)되고 각 요소 객체는 생성하여 저장

-> 주소를 저장할 방이 5개가 잡히는 것이라고 생각하자

위와 같이 Book[] libaray = new Book[5]; 으로 객체 배열을 만들고

이렇게 객체 배열에 값을 직접 넣어준다.

// 참고 //

이런 식으로 객체 배열 값을 변수에 저장할 수 있음

3. 객체 배열 복사하기

System.arraycopy(src, srcPos, dest, destPos, length) -> 자바에서 제공되는 배열 복사 메소드

src는 복사할 배열, dest는 복사한 것을 넣어주는 배열

위와 같은 기본형을 가지며 위 코드를 해석하자면 library의 0~ 전체를 copylibrary 배열의 인덱스 0부터에 집어 넣어라!

 

 

얕은 복사

-> 객체의 주소만 복사되어 한 쪽 배열의 요소를 수정하면 같이 수정된다.(두 배열이 같은 객체를 가리킨다고 생각하자)

위와 같이 System.arraycopy를 사용하는 것은 얕은 복사

깊은 복사

-> 객체의 모든 구조를 복사하여 독립적인 객체를 만듬

객체를 따로 만들고 그 안에 값을 복사해 넣는 방식으로 하면 된다.(당연한 이야기)

4. 객체 배열을 구현한 클래스 ArrayList

java.util 패키지에서 제공되는 ArrayList

-> 기존의 배열 선언과 사용 방식은  배열의 길이를 정하고 요소의 개수가 배열의 길이보다 커지면 배열을 재할당하고 복사해야했음. 또한 배열 요소를 추가하거나 삭제하면 다른 요소들의 이동에 대한 구현을 해야함

1. ArrayList는 객체 배열을 좀 더 효율적으로 관리하기 위해 자바에서 제공해주는 클래스

2. 이미 많은 메서드들이 최적의 알고리즘으로 구현되어 각 메서드 사용법만 익히면 유용

ArrayList의 주요 메서드

꼭 import java.util.ArrayList 해줘야함

또한, 기본형은 ArrayList<데이터 타입> 인스턴스네임 = new ArrayList<>();

<> 사이에 데이터 타입 지정

기본 사용법

5. 캡슐화

정보 은닉을 활용한 캡슐화

1. 필요한 정보와 기능만 외부에 오픈

2. 대부분의 멤버 변수와 메서드를 감추고 외부에 통합 인터페이스만 제공하여 일관된 기능을 구현

3. 각각의 메서드나 멤버 변수에 접근함으로써 발생하는 오류룰 최소화한다.

-> private으로 숨김