-
(국비교육) 14 - 패키지 + 접근제어자 + gettersetter + 상속 + 오버라이딩vs오버로딩 + static + final + 다형성 + 추상화개발/국비교육 2023. 6. 20. 16:26
■ 패키지 (p. 286)
- 관련성 있는 자바 파일들을 폴더 단위로 구분
- 회사 프로젝트 시 중복 방지를 위해 도메인으로 패키지 이름을 만들어서 사용
EX)
com.poseidon.print (3단계)
net.daum.map■ import (p. 290)
- 상위패키지.하위패키지.클래스명
EX) import java.util.*
- * : 하위 개 중 사용하는 것들은 가져온다.
■ 접근제어자 (public, protected, default, private_p.293)
자바에서는 API 를 사용할 때 제어자에 따라서 접근 허용여부가 달라진다.
접근제어자는 크기순서대로
public > protected > default > private위 접근제어자는 클래스 선언, 생성자 선언, 메소드 선언, 필드 선언할 때 사용한다.
이 중 클래스는 public, default(생략) 만 사용할 수 있다.다른 패키지를 뛰어넘는 것은 public 만 가능
이 중 클래스는 public, default(생략) 만 사용할 수 있습니다.
- public : 접근 범위가 가장 큰 제어자로 다른 패키지에서도 접근이 가능
- protected : 상속 받은 자식 클래스만 다른 클래스에서 접근 가능
기본적으로 같은 패키지 내에서는 접근이 가능합니다.
- default : 제어자를 선언하지 않을 때 자동으로 선언됩니다.
(생략) 같은 패키지 내에서만 접근 가능합니다.따라서 AccessModifier 클래스에서 public 이 붙은 필드 num1과 메소드 print1() 은 호출 가능하지만,
number 과 print2() 는 호출 불가능하다.
- private : 자신의 클래스에서만 접근 가능하며, 다른 클래스에서 접근 불가.
■ getter setter
private 으로 걸려있는 값은 기본적으로 자신의 클래스에서만 접근 가능하다.
따라서 private 된 값을 가지고 오기 위해서는 getter setter 을 이용해주면 된다.
setNumber 는 입력받은 값을 this.number 을 통해 저장하고,
getNumber 는 리턴으로 이 값을 되돌려준다.
생성자에 private 로 넣었기 때문에
Apple a = new Apple();
로 객체를 생성할 수 없다.
따라서 getInstence() 메소드를 만들고 return new apple() 을 통해 우회 접급해야 한다.
그러나 바로 Apple.getInstence() 를 하면 오류가 뜬다.
왜냐하면 객체를 생성하지 않았기 때문이다.
따라서 객체를 생성하지 않고도 되는 Static 을 메소드에 넣어주고 정상적으로 객체를 만들 수 있다.
위처럼 입력값을 100 보다 크게 넣었을때는 50을 출력하고,
"바보" 또는 null 값 입력 시 "춘식이" 가 나오도록 검증을 넣어줘서 출력값을 조절해 줄 수 있다.
■ 상속(= 확장_p.310)
* 상속연결
class 이름 뒤에 extends 부모클래스
부모의 코드를 자식이 자신의 것처럼 쓸 수 있다.
따라서 public 과 protected 에 있는 number1 과 number2 를 사용 가능하다.
부모 클래스, 상위 타입, 슈퍼 타입
자식 클래스, 하위 클래스, 서브 타입
자식이 가진 것을 부모는 가져가지 못한다.
반대로 자식은 부모가 가진것을 가져갈 수 있다.
자바는 extends 한 개 밖에 쓰지 못한다.
즉 , 로 연결해서 사용할 수 없다. (= 단일상속)
부모 자식 관계로 엮여있기 때문에 Animal 타입의 Cat() 형태로 넣을 수 있다.
그러나 Dog 와 Cat 은 엮여있지 않기 때문에 오류가 난다.
* 상속 정리
자바에서 클래스의 상속은 아래와 같은 장점이 있습니다.
1. 기존에 작성된 클래스를 재활용 할 수 있습니다.
2. 자식 클래스 설계 시 중복되는 멤버를 미리 부모 클래스에 작성해 놓으면,
자식 클래스에서는 해당 멤버를 작성하지 않아도 됩니다.
3. 클래스 계층적 관계를 구성함으로써
다형성의 문법적 토대를 마련합니다.
class 자식클래스 이름 extend 부모클래스이름 { ... }자바에서 클래스는 단 한 개의 클래스만을 상속받는
단일 상속만이 가능합니다.자바의 모든 클래스는 Object의 하위 클래스 입니다.
http://www.tcpschool.com/java/java_inheritance_concept
■ 오버라이딩
부모 클래스에 있는 sound() 를 자식 클래스마다 소리를 다르게 하기 위해서는
오버라이드 기능을 재정의해서 내는 소리를 달리 설정해주면 된다.
※ 오버라이드 / 오버로드
* 오버라이드 : 상속, 메소드 재정의 (p. 319)
- 부모의 메소드를 자식 클래스에서 재정의 해서 사용하는 것
- 부모의 일부 메소드를 다시 수정해서 사용하기- 규칙 :
1. 부모의 메소드와 동일한 시그니처(리턴타입, 메소드명, 매개변수) 가지고 있어야 한다. 다르면 다른 메소드
2. 접근제한을 더 강하게 할 수 없다. 동일하게 설정
3. 새로운 예외를 Throw 할 수 없습니다.
오버라이드 했다면 상단에 @override 라고 표시됩니다.
자식 메소드에서 재정의 했다면 부모의 메소드는 은닉됩니다.은닉된 부모의 객체를 호출할 때는 super 로 호출합니다.
* 오버로드 : 매개변수, 같은 이름, 다른 호출
- 하나의 클래스 속에 같은 이름의 메소드를 여러개 만드는 것
- 메소드 시그니처(수, 순서, 타입)이 일치하지 않으면 된다.
- 호출할 때는 시그니처에 맞는 메소드가 일을 한다.
- 접근제어자, 리턴타입은 보지 않는다. 오로지 파라미터만.* myInfo() 메소드로 주민번호 ** 로 표시하기
Korean 클래스에 있는 메소드를 오버라이드를 통해 사용할 수 있다.
원하는 수만큼 주민번호를 가져오는 방법은 substring() 을 이용하면 된다.
■ 메소드 은닉
aaa와 aaa4 는 Animal 타입이지만 Dog() 와 Korean() 클래스 내용을 가져온다.
따라서 오버라이드 한 aaa4.sound(); 는 나오지만
타입이 animal 이기 때문에 자식 클래스 Korean 에 있는 ssn 은 은닉되어 가져오지 못한다.
aaa4 는 Korean() 클래스에 있는 내용을 가져온 것이지 타입은 Animal 이다.
따라서 자식 메소드에 있는 myInfo() 를 사용하기 위해서는 Korean 타입으로 변경해줘야 한다.
Korean kor = (Korean) aaa4; -----> cast 작업 필요
그러면 kor.myInfo(); 를 통해 이용할 수 있다.
이전에 배운 내용에도 동일하게 적용된다.
List<Integer> l = new ArrayList<>();
부모 자식
Set<Integer> s = new HashSet<>();부모 자식
Map<Integer, Integer> m = new HashMap<>();부모 자식
■ static
static 은 heap 영역이 아니라 메소드 영역에 저장되고 출력된다.
별도 객체 생성 없이도 출력 가능하고 클래스와 붙여서 쓰인다.
static 은 정적이라는 의미를 가지고 있다.
자바에서는 정적 개념과 동적 개념이 있다.쉽게 표현하면 정적은 클래스가 로드되는 시점이다.
동적은 로드된 클래스가 실행된 이후를 말한다.
이 중 객체는 동적 데이터라고 해서 프로그램이 실행된 이후에 발생되는 대표적인 형태이다.
클래스를 정의할 때 static 키워드를 사용한 프로퍼티와 메소드는해당 클래스의 인스턴스를 생성하지 않아도 접근할 수 있게 된다.
이러한 프로퍼티와 메소드를 정적 멤버(static member) 라고 합니다.※ 메모리 저장
- 메소드 area : class 정보, static 변수
- heap area : new 연산자로 생성된 객체, array 와 같은 동적으로 생성된 데이터 저장되는 공간
- stack area : 지역변수, 후입선출
메소드에 쓰이는 지역변수는 stack 에 저장되고, 쓰임이 끝나면 삭제처리
count 의 경우 static 으로 계속 count 값을 공유한다.
따라서 a2.count 에서 값을 100으로 넣어줬기 때문에
a1.count 를 출력해도 100이 출력됨을 알 수 있다.
■ final (p.281)
수정 불가로 만들기 위해 final 넣어주면 값 초기화 작업을 해줘야 한다.
그리고 상수(=변하지 않는 수) 이기 때문에 변수를 대문자로 바꿔준다.
■ 싱글턴 패턴 (p.279)
: 특정 클래스에서 객체 인스턴스가 하나만 만들어지도록 해주는 패턴.
ex) 데이터베이스 접속정보(딱 하나만 존재)
https://m.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS8616098823
■ 다형성 (p. 332) / 앞선 메소드 은닉 부분 설명 참고
- 다양한 형태로 변할 수 있는 것.
- 다형성은 동적 바인딩 : 런타임 때 최종 타입이 결정되는 것
- 다형성을 지원하려면 그 언어가 동적바인딩을 지원해야 합니다.
- 컴파일 타임 때 에러 판정이 납니다.
- 다형성의 한계 : 상위 클래스에 만들어진 메소드에 한해 가능합니다.* 영웅 만들기
h1은 Hero 타입으로 attack 은 가져올 수 있지만 Ironman 에만 있는 메소드 makeSuit는 가져오지 못한다.
따라서 이를 가져오기 위해서는 Ironman 타입으로 다시 객체를 만들어주고 캐스팅 처리해야 한다.
더불어 =(대입기호) 를 사용하여 h1 과 ironman 이 얕은 복사가 이루어져
같은 객체 주소값을 참조하게 된다.
반복해서 공격을 출력하기 위해서 우리는 set 을 이용할 수 있으며,
for each 구문으로 편하게 출력 가능하다.
■ 추상화 => 인터페이스 (p. 356~365)
- 추상클래스 : 인터페이스의 역할을 하면서 클래스 같은 돌연변이 같은 클래스
- 추상 : 대략적으로 만들었기 때문에 내부 구성을 완벽히 만들어야 객체 생성 가능
- 정물 : 객체를 생성할 수 있는 클래스
자바에서 추상화 라는 개념이 있다.
일단 추상이라는 의미는 현실화 되어질 필요가 없는,
즉, 인스턴스화 할 필요가 없는 성질의 클래스이다.
자바에서는 객체지향을 통해 프로그램이 실행되는데,
이 추상이라는 개념을 클래스에 적용시키면자신의 인스턴스를 발생시킬 수 없는 형태로 만들어지게 된다.
이렇게 인스턴스화 될 필요가 없지만상속 개념에서 중요한 위치를 갖게 될 때 보통 추상 클래스로 선언하여 사용한다.
* 추상 클래스 선언규칙
1. 클래스에 정의된 메소드 중 추상 메소드가 하나라도 있다면 추상 클래스가 되어야 합니다.
2. 추상 메소드는 메소드 바디가 없는 형태 print() {...}※ 바디 : { }
리턴 타입 앞에 abstract 라고 붙입니다.
메소드 괄호 뒤에 ; 를 붙여명령문 끝을 나타냅니다.
abstract void print();
3. 추상 클래스는 자신의 인스턴스를 만들 수 없습니다.추상 메소드가 있다면, 클래스 앞에 abstract 라고 붙여줍니다.
생성자, 메소드, 필드 모두 선언 가능합니다. 상속도 가능합니다.
4. 만약 추상 메소드가 없지만 클래스를 추상화 하고 싶다면
abstract 키워드를 클래스 앞에 붙여주면 추상 클래스가 됩니다.객체 생성은 못하지만 상속을 통해 오버라이드를 통해 메소드는 쓸 수 있다.
http://www.tcpschool.com/java/java_polymorphism_abstract
※ DAO / DTO 란?
'개발 > 국비교육' 카테고리의 다른 글