기본 콘텐츠로 건너뛰기

Part3 객체지향 프로그래밍의 기법(10장 ~ 11장)

상속 : 특정 클래스를 구성할 때 기존 클래스의 데이터(속성)와 메소드를 상위(부모) 클래스에서 그대로 물려받아서 중복적인 코드를 줄인다는 장점과, 하나의 변수 타입으로 여러 종류의 객체를 의미하는 추상화 된 방식의 프로그램이 가능하게 하는 객체지향 기법 

부모 클래스(Super 클래스)

자식 클래스(Sub 클래스)

extends : 상속을 사용하는 문법

WheelMouse m = new Mouse();

휠마우스의 휠 기능의 정의를 못하므로 에러인가봄

public class MouseTest{
  public static void main(String[] args){
    System.out.println("------------");
    Mouse op = new OpticalMouse();
    op.clickLeft();
    op.clickRight();
  }
}

결과 

---------------------

광센서로 왼쪽 클릭

광센서로 오른쪽 클릭

실행되는 메소드는 실제 객체의 메소드가 호출 - 변수의 타입이 무엇이든 간에 실제로 움직이는 것은 리모컨(레퍼런스)에 연결된 객체

 - 컴파일러는 변수 타입으로 선언된 클래스에 해당하는 메소드가 있는지만 확인

 - 실제로 움직이는 것은 연결된 객체

 - 만일 실제 객체에 해당 메소드가 없다면 부모 클래스의 정보를 추적해서 실행

오버라이드 : 자식 클랙스에서 부모 클래스의 메소드를 다시 정의

super : 부모 클래스를 부르는 키워드, 부모 클래스에 정의된 생성자를 사용(this로 자식에서 재정의 가능)

다형성 : 상속을 사용하여 하나의 변수 타입으로 여러 가지 종류의 객체를 가리킬 수 있어서 기존 코드를 고치지 않고도 처리할 수 있는 부분이 많아짐

상속의 장점 - 변수의 타입과 실제 객체가 일치하지 않아도 됨, 부모 타입으로 파라미터, 배열을 선언가능

생성자....

추상 클래스 : 변수의 타입으로만 의미가 있고, 객체로 생성될 가능성이 없는 것은 클래스 선언 앞에 'abstract'를 붙여서 추상 클래스로 생성, 용도는 객체 생성은 하지 않으나 변수 선언 용도, 상속의 고유 기능인 하위 클래스에 같은 데이터와 기능을 가지도록 물려줌

추상 메소드 : 하위에서 반드시 오버라이딩 해야하는 메소드

프로그램 제작 순서

1. 해당 데이터 들을 몇 개의 클래스로 만들어야 할지 결정

2. 상속 구조가 가능한지 결정

3. 일반 상속이 나은가 추상 클래스가 나은가

4. 부모 클래스에 있어야 할 속성과 메소드를 조절

5. 데이터를 활용하는 계산은 객체가 알아서 하도록 결정

인스턴스 변수에 protected는 상속 관계에서 변수나 메소드의 접근을 허용 private는 같은 클래스 내에서만 메소드나 변수로의 접근 허용

상속의 다운 캐스팅 : 부모가 아닌 자식이 가진 메소드 지정

instanceof : 해당 클래스의 타입인지를 따져보는 연산자 하지만 해당 변수를 원하는 타입으로 볼 수 있는지를 판단하므로 문제가 될 수 있음 0, 1, 2다 일반 마우스로 나옴

getClass()가 instanceof보다 더욱 정확한 결과를 가져온다.

final : 더이상 변경 불가 

        -메소드 선언 시 : 자식 클래스가 오버라이드 못함

        -클래스 선언 시 : 더이상 상속 못함 -> 타입도 제한, 하위 클래스를 검색하지 않으므로 미세하게 속도 빨라짐

       -변수 선언시 : 변수값 변경을 막음

상속 사용의 체크 포인트 : '반드시 ~의 일종'이 성립할 때, 하위 클래스에서 오버라이드를 많이 쓰면 위험한 신호, 조합을 많이 하면 상속이 아니라 프로그래밍이 나음

인터페이스 : 인터페이스는 실제 객체를 의미하지 않음, 인터페이스의 상수는 private으로 만들 수 없음(자동으로 public static final이 됨), 추상 메소드만 존재, 객체의 타입으로만 사용

인터페이스 사용 상황 : 메소드의 형태가 결정, 

느슨한 커플링 : 상속이나 인터페이스를 이용한 다형성을 구현

인터 페이스 예시 

CopyMachine a = new Machine();
FaxMachine a = new Machine();
PrinterMachine a = new Machine();
다형성 : 하나의 객체를 여러 개의 타입으로, 하나의 타입으로 여러 종류의 객체를, 하나의 객체를 여러 가지 타입으로 선언할 수 있다는 뜻
인터페이스로 다중 상속 : 기존 인터페이스들을 묶어서 하나의 새로운 스펙을 만듬, 변수의 타입을 인터페이스로 그대로 유지, 풍부한 다형성 제공
의존성 주입 : 코드를 작성할 때 의존적인 코드는 만들지 말고, 외부에서 필요한 객체를 넣어준다.
인터페이스와 추상 클래스의 비교 : 둘 다 모두 추상 메소드라는 것을 가진다
                                             둘 다 객체 생성은 불가능하고, 타입으로만 사용된다 
                                             인터페이스는 스펙이나 원하는 기능을 정의할때 쓰지만, 추상 클래스는 '상속 + 약간의 강제성이 목적'이다
                                             인터페이스는 상수, 추상 메소드만 존재하지만, 추상 클래스는 상속이 원래 목적이므로 실제 변수나 메소드를 그대로 가지고 있다
                                             인터페이스는 부채만 남겨주지만, 추상 클래스는 재산도 남겨 준다
                                             인터페이스는 다중 상속도 가능, 추상 클래스는 단일 상속만 가능
추상 클래스가 더 나은 상황 : 거의 모든 기능을 그대로 물려주면서 부분적으로 한 가지나 두 가지의 기능이 다를 때
인터페이스가 더 나은 상황 : 추상 클래스가 완벽하게 좋은 경우 뺴고 다














댓글

이 블로그의 인기 게시물

mac 맥 맥북 Brew 완전 삭제

맥북에서 Brew 초기화 Brew를 써서 h2를 쓰려고 하는데 brew install h2가 안되서 이리 저리 알아보다가 완전 삭제 후 다시 설치 하니까 되서 그 방법을 남겨놈 1. 터미널에 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh)" 입력후 y랑 뭐 비번.. 2. /usr/local 폴더에서 Homebrew 폴더 삭제 rm -rf Homebrew/ 권한설정으로 잘.....삭제하고 3. 다시 설치 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" 좀 오래걸리니까 기다려야한다는걸 배움... 출처.... https://discourse.brew.sh/t/error-no-formulae-found-in-taps/8331/9

메이븐으로 라이브러리 인식

 간혹 퍼블릭 jar가 아닌 파일이 있는데 그럴때 쓰면 될듯 <dependency> <groupId> SimpleCryptLib </groupId> <artifactId> SimpleCryptLib </artifactId> <version> 1.1.0 </version> <scope> system </scope> <systemPath> ${basedir}/src/main/webapp/WEB-INF/lib/SimpleCryptLib-1.1.0.jar </systemPath> </dependency> version, scope, systemPath는 꼭 작성해야 한다 groupId, artifactId, version은 암거나 해도 되는거 같음 최근(2021.05.04)스프링 부트    < dependency > < groupId > NiceID </ groupId > < artifactId > NiceID </ artifactId > < version > 1.0 </ version > < scope > system </ scope > < systemPath > ${basedir}/src/main/resources/lib/NiceID.jar </ systemPath > </ dependency > 이걸 추가해주는것도 필요할지도..?? < build > < plugins > < plugin > < groupId > org.springframework.boot </ groupId > < artifactId > spring-boot-maven-plugi

ORA-28000 계정이 잠금되었습니다 계정 잠길때

오라클 계정이 잠길때 해제방법 증상 t he account is locked 오류 발생 원인 Oracle 에서 t he account is locked  에러가 나는 원인은 ● 잘못된 패스워드로 설정횟수만큼 접속 시도시 Lock. ●  30일동안(Default) 해당 계정으로 로그인을 하지 않았을 경우 Lock. 등이 있다. 해결방법 command창에서 * 로컬일경우, sqlplus "/as sysdba"  또는  sqlplus /nolog  conn /as sysdba  * 로컬이 아닐 경우, sqlplus /nolog conn sys/password@<sid> 이름/패스워드@sid로 입력 로 접속 후 SELECT username, account_status, lock_date FROM dba_users; 으로 Lock이 된 사용자를 확인한 후 LOCKED<TIMED> 라고 되있으면, 패스워드 설정횟수 입력 오류로, 아래의 Unlock 명령만, EXPIRED & LOCKED 라고 되있으면, 패스워드 기간만료로, Unlock 후 비밀번호를 지정해줘야 한다. ALTER USER 사용자명 ACCOUNT UNLOCK; 로 Lock된 사용자를 Unl ock 시킨다 방금 말했다시피, 다시 Lock된 사용자 확인했는데,  Open되지 않고 EXPIRED되어 있다면, alter user 사용자명 identified by 바꿀패스워드;  로 패스워드를 변경하거나 또는 SQL*PLUS 를 재시작하여 Lock를 해제한 계정(사용자명/패스워드)로 로그인 하면 패스워드 변경 창이 뜬다. 추가로 패스워드 Lock 횟수 확인하는 방법은 SELECT U.USERNAME,P.PROFILE, P.RESOURCE_NAME, P.LIMIT  FROM D