14. 인터페이스의 여러가지 요소

<오늘의 목표>

어제 등장했던 아직까지 이숙하지 못한 명령어 들을 훌터보자.

<방법>

어제 정리한 블로그의 문서를 복습후 학습 시작


이론 정리

어제 등장했었던 명령어가 호출되는 순서 :

  1. 1) 파일을 검색 한다.
    1. 파일 이름을 인수로 보내면 참조 변수에 파일의 위치가 입력된다.
    2. 파일이 없으면 오류 FileNotFoundException가 출력되며. try로 오류대응을 하거나 , 처음에 NULL을 넣어서 NULL이 변하지 않으면 NULL일 경우의 조건식으로 처리하는 코드를 웹상에서 발견했다.
    3. fileinputstream 참조변수B = new fileinputstream(”파일이름”)
  2. 페어 구조(Key=Value)로 값이 입력될수 있는 영역을 갖고 있는 참조 변수와 인스턴스를 만든다.
    1. properties 참조변수A = new properties();
  3. 패어 구조를 입력 하기 위해 만들어진 공간에 file의 위치값를 입력해서 값을 불러와서 저장한다.
  • 참조변수A.load(참조변수B);
  1. key값을 넣어서 value값을 확인 한다.
  • String 참조변수C = 참조변수A.getProperty(”key 값”);

<CODE TEST>

파일 불러오기

  • fileinputstream을 사용하기 위해서 파일 이름을 인수로 보낼때. 파일이름에 프로젝트 루트 계층부터 파일 영역을 입력해 줘야한다.
    • 예로 들어 TEST(페키지)/A 일 경우 아래 코드와 같이 src/TEST/A파일 로 지정해주면 된다. 아니면 루트영역에 넣으면 파일이름만 입력하면 검색된다.
    package A_0217;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.Properties;
    
    public class M {
    	public static void main(String[] args) throws IOException {
    		FileInputStream F = new FileInputStream("src/test/A");
    		Properties P = new Properties();
    		P.load(F);
    		System.out.println(P.getProperty("Key_A"));
    	}
    }
    
    Key_A=value_A
    

<14챕터>

모든 변수는static final이 붙는다. static 이 붙으면 하부에서 구현된 클레스들에서 오직 하나의 인스턴스에 접근할수 있게 막을수 있지만. 자바에서 단일상속만 기능한것 처럼. 모호성으로 인해 안전성이 낮아지는것을 막기위해 변수가 변하지 못하는 방법으로 사용됩니다.

자바 8 이후 부터 사용할수 있는 인터페이스 기능들

1) default method : 디폴트 메소드

default 키워드를 메소드 앞에 붙여서 구현하는 클레스들에서 반복적으로 구현해야하는 메소드를 인터페이스에서 기본적인 형태를 구현해 놓을수 있게 되었다.(필요에의해 implement한 클레스에서 재정의 할수 있다)

TEST 1 : default로 구현한 메소드는 구현하는 클레스에서 메소드를 정의하지 않아도 되는거?

태스트 결과 : YES

TEST 2 : default로 구현한 메소드는 구현하는 클레스에서 재정의(overide)할수 있는가?

태스트 결과 : YES

package TEST3;

public class Do {
	public static void main(String[] args) {
		Sub S = new Sub();
		S.method_A();
	}
}
package TEST3;

public class Sub implements Super {
	public void method_A() {
		System.out.println("SUB method");
	}
}
package TEST3;

public interface Super {
	default void method_A() {
		System.out.println("만약 이것이 보이신다면 오버라이드 되지 않는것입니다.");
	}
}

2) static method : 정적 메소드

default와 마찬가지로 구현하는 클레스들에서 반복적으로 구현해야하는 메소드를 미리 구현할수 있지만. 인터페이스 객체를 implement 하거나 인스턴스를 만들지 않아도 프로젝트 내에서는 어디서든 사용할수 있게 할수 있다.

package TEST4;

public class Do {
	public static void main(String[] args) {
		Super.method_A();
	}
}
package TEST4;

public class Sub implements Super {
	public void method_A() {
		System.out.println("SUB method");
	}
}
package TEST4;

public interface Super {
	static void method_A() {
		System.out.println("영차");
	}
}

자바 9 이후 부터 사용할수 있는 인터페이스 기능들

  1. private 메서드

구현한 클레스에서 재정의 불가능하다.

구현한 클레스에서 사용할수 없다. (진짜인지 테스트 코드 구현해보고 싶은에 이클립스 오류로 인해 연기하기로 함)

인터페이스 내부에서 static 이나 default를 사용하기 위해서 재공하는 메소드 이다.

  • 구현하는 클레스에서 사용하기 위한게 아닌. 인터페이스 내이서 사용하기 위한 기능이다.

이클립스에서 JDK의 다른 버전 선택에 대한 . 궁금증과 더불어 다음 정리에서 학습을 진행 하기로 하겠습니다.


전문 용어


 

에러 메세지


학습 시간


 

캠 스터디


공부 모임

1) 카카오톡 오픈 채팅방

  - 모르는것을 질문하거나

  - 이해가 가지 않는 부분을 다른 분들의 블로그에서 참고하기 용도

2) 구루미 온라인 독서실

  - 학습 시간을 관리 하거나 경쟁 하는 용도 

 

온라인 강의 주소

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

 

 


13강 까지를 되돌아 보며,

<오늘의 목표>

  1. 13챕터까지 코드를 강의에 있는 대로 따라서 짜본다.
  2. 13챕터까지의 강의에서 소계된 새로운 기술들이 포함 되어있는 새로운 과제를 만들어서 코드를 작성한다.
  3. 인터페이스 강의가 2개정도 남았지만. 우선 이전의 기술을 어떻게 응용 할수 있는지에 대해서 고민하되 용도를 스스로 단정짖지 않는다.
  4. 개발의 영어 단어를 노트에 1차 암기해본다. 
  5. 1~13강의 까지의 이전강의들을 훌터보고 아직 미숙하다고 생각하는 계념을 뽑아서 확인해본다.

이론 정리

<13강 - 코드 카피>

이어서 13챕터의 코드작성 정리 글을 작성하고 있습니다.

  • 인터페이스 타입의 참조변수를 만들고. 상황을 인지하여 그 상황에 대비된 클레스들중 하나로 인스턴스를 만들면 그 인스턴스의 값과 명령으로 작동되게 됩니다.
    • 이래서 인터페이스를 쓰는군요 ㄷㄷ
  • momain에서는 인터페이스와 구현을 클라이언트에서는 자신의 환경과 그 인터페이스의 환경에 따라서 인스턴스를 생성하는 일을 한다.

조건

  1. DOMAIN 과 WEB의 영역으로 나뉘고 기능 아래에 환경 아래 코드가 있었다.
  2. 일단 똑같은 코드를 않보고 짜보면서 . 이 코드를 이해해보자.
  3. 코드 카피 방법론의 순서를 정리한다.
    1. 구조를 파악한다
    2. 구조를 제작한다.
    3. 내부의 파일을 제작한다.
    4. 실행 파일을 만든다.

테스트

페키지를 만들때

페키지 이름을"A.B.C.D"로 하나를 만들었을때

1)A와 2)A.B 와 3)A.B.C와 4)A.B.C.D가 같이 만들어질까?

태스트 결과 : 맞다.

만약 domain에 포함된 userinfo에 포함된 DAO에 포함된 oracle패키지를 만들때. 한번에 만들수 있는 방법을 이용해서 java파일을 이렇게 만들면 페키지가 자동으로 생성될까?

태스트 결과 : 아니다.

 

class를 입력할때 페키지를 정학히 지정 해야 하기 때문.

개인적으로는 이번 소드 코드 구조를 학습 하면서 마크다운 문서 제작 경험이 도움이 되었는데.

이런 소스 코드의 구조를 마크다운 문서에 임포트 되는 여러가지 파일의 구조로 사용했었기 때문이다.

<않보고 코드 입력. 성공!ㄱ>

package domain.userinfo.dao.mysql;

import domain.userinfo.dao.UserInfoDao;

public class userinfoMySqlDao implements UserInfoDao {

	@Override
	public void Method_A() {
		System.out.println("MySQl method");
		
	}

}
package domain.userinfo.dao.oracle;

import domain.userinfo.dao.UserInfoDao;

public class userInfoOracleDao implements UserInfoDao {

	@Override
	public void Method_A() {
		System.out.println("Oracle method");
	}

}
package domain.userinfo.dao;

public interface UserInfoDao {
	void Method_A();
}
package web.userInfo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

import domain.userinfo.dao.UserInfoDao;
import domain.userinfo.dao.mysql.userinfoMySqlDao;
import domain.userinfo.dao.oracle.userInfoOracleDao;

public class UserInfoClient {
	public static void main(String[] args) throws IOException {
		FileInputStream FS = new FileInputStream("db.properties");
		Properties Pp = new Properties();
		Pp.load(FS);
		String DBtype = Pp.getProperty("DB");
//		System.out.println(DBtype);
		UserInfoDao userinfoDao = null;
		if(DBtype.equals("ORACLE")) {
			userinfoDao =new userInfoOracleDao();
		}else if(DBtype.equals("MYSQL")) {
			userinfoDao = new userinfoMySqlDao();
		}else {
			System.out.println("DB Type ERROR");
		}
		userinfoDao.Method_A();
	}
}
DB=ORACLE

어느정도 암기 완료 ^^;.. 아직까지 익숙하지 못한 명령어 정리 :

fileinputstream 참조변수B = new fileinputstream(”파일이름”)

properties 참조변수A = new properties();

참조변수A.load(참조변수B);

String 참조변수C = 참조변수A.getProperty(”값”);

파일에는 “”제외하고 값만 넣는다.

만 기억하면 될것 같다.


전문 용어


 

에러 메세지


학습 시간


 

캠 스터디


공부 모임

1) 카카오톡 오픈 채팅방

  - 모르는것을 질문하거나

  - 이해가 가지 않는 부분을 다른 분들의 블로그에서 참고하기 용도

2) 구루미 온라인 독서실

  - 학습 시간을 관리 하거나 경쟁 하는 용도 

 

온라인 강의 주소

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

 

 


3:1:01 ~ 3:1:13

<인터페이스의 다형성>

하위 객체들에서 구현해야 하는 기능을 정리해 놓은것 ( 강제적인 규정임 )

주의: 이번 챕터의 내용은 읽는 분들을 위해 정리 되어 있는게 아닌. 제가 모르는 것 위조로 정리 해 놓았기 때문에. 읽다보면 맨탈이 위험 합니다 ^ω^! 

 

오류 : UserInfo cannot be resolved to a type :참조하려는 값이 같은 페키지가 아니기 때문에 . 오류가 발생함.

해결책 : import로 해당값이 있는 객체를 넣는다. 

 

DAO파일작성법

  • 접근하려는객채+접근하려는DB형태+Dao
  • 인터페이스를 구현하는 dao 라서 그런지 모르겠지만 구현하려는 DB형태의 페키지를 만들고 내부에 Dao작성함. 상위 클레스에 인터페이스 가 있는셈이다.
  • 이클립스에서는 인터페이스 파일 위에 i라는 글자 라는 벳지가 있다.
  • 인터페이스를 구현하는 객체에서 구현하지 않는 메소드가 있으면
  • The type UserInfoMySqlDao must implement the inherited abstract method userInfoDao.deleteUserInfo(UserInfo) 이라는 에러가 뜬다.
  • 에러가 뜨는 대상에게 ctrl+1을 선택하면
  • 어떤 메소드가 부족한지 코드 계층으로 표시 해준다.

 

  • protected는 상속관게 뿐만 아니라 다른 페키지에서 인스트된 된 객체에도 통한다.
  • MySQl DB로 userID를 보낸다 : insert into MySql DB userId
  • 파일 IO를 사용하기 위해 파일명으로 파일을 탐색하게 할때. 가장 먼서 프로젝트의 폴더 루트 영역부터 찾기 때문에 속도를 줄일떄는 루트 공간에 넣으면 좋다고 한다
  • 파일 IO
    1. FileInputStream 참조변수명A = new FileInputStream("파일명.확장자");
    2. import java.io.FileinputStream;
    3. import java.FileNotFoundException; →1번 타이핑후 빨간줄에서 쓰로우 선택. 1.
    4. properties 참조변수명B = new properties();
      1. 파일에 “값A”=”값B” 으로 페어로 입력되어 있는 값을 불러올수 있다.
      2. 값A는 key. 값B는 value 라고 하여 .key를 입력하면 value가 나온다.
    5. 참조변수명.load(참조변수명A)
      1. load코드의 빨간줄에서 throws 선택

package ch13.domain.userInfo.dao.mysql;

import ch13.domain.userInfo.UserInfo;
import ch13.domain.userInfo.dao.userInfoDao;

public class UserInfoMySqlDao implements userInfoDao {

	@Override
	public void insertUserInfo(UserInfo userInfo) {
		System.out.println("insert into MySQL DB userID = "+userInfo.getUserId());
	}

	@Override
	public void updateUserInfo(UserInfo userInfo) {
		System.out.println("update into MySQL DB userID = "+userInfo.getUserId());
		
	}

	@Override
	public void deleteUserInfo(UserInfo userInfo) {
		System.out.println("delete from MySQL DB userID = "+userInfo.getUserId());
	}

}
package ch13.domain.userInfo.dao.oracle;

import ch13.domain.userInfo.UserInfo;
import ch13.domain.userInfo.dao.userInfoDao;

public class UserInfoOracleDao implements userInfoDao {
	@Override
	public void insertUserInfo(UserInfo userInfo) {
		System.out.println("insert into Oracle DB userID = "+userInfo.getUserId());
	}

	@Override
	public void updateUserInfo(UserInfo userInfo) {
		System.out.println("update into Oracle DB userID = "+userInfo.getUserId());
		
	}

	@Override
	public void deleteUserInfo(UserInfo userInfo) {
		System.out.println("delete from Oracle DB userID = "+userInfo.getUserId());
	}
}
package ch13.domain.userInfo.dao;

import ch13.domain.userInfo.UserInfo;

public interface userInfoDao {
	void insertUserInfo(UserInfo userInfo);
	void updateUserInfo(UserInfo userInfo);
	void deleteUserInfo(UserInfo userInfo);
}
package ch13.domain.userInfo;

public class UserInfo {
	protected String userId;
	protected String password;
	protected String userName;
	public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	
}
package ch13.web.userInfo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

import ch13.domain.userInfo.UserInfo;
import ch13.domain.userInfo.dao.userInfoDao;

public class UserInfoClient {
	public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream("db.properties");
		Properties prop = new Properties();
		prop.load(fis);
		String dbType= prop.getProperty("DBTYPE");
//		System.out.println(dbType);
		UserInfo userInfo = new UserInfo();
		userInfoDao userInfoDao = null; //why?
	}
}
DBTYPE=MYSQL

 


전문 용어


 

에러 메세지


학습 시간


 

캠 스터디

 


공부 모임

1) 카카오톡 오픈 채팅방

  - 모르는것을 질문하거나

  - 이해가 가지 않는 부분을 다른 분들의 블로그에서 참고하기 용도

2) 구루미 온라인 독서실

  - 학습 시간을 관리 하거나 경쟁 하는 용도 

 

온라인 강의 주소

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

 

직장인인강, 직장인자기계발, 패스트캠퍼스, 패스트캠퍼스후기, 패캠챌린지, 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.강의


3:1:01 ~ 3:1:13

인터페이스의 다형성 구현 ( 코드작성 파트 )

<다형성을 언제 사용할까요?>

  1. 인터페이스의 메소드_A(배열을 정렬시키기)를 다양한 방향으로 하위 클레스마다 구현할수 있다.
    • 메소드A는 같은 기능을 정의하고 있지만 . 다양한 방법을 제공할수 있다.
    • 이런 방법을 strategy pattern(스트래티지 패턴)이라고 한다.

-

-

 

  1. 하나의 기능을 다양한 환경에서 작동 되도록 할수 있다.

<코드 구현을 해 봅시다.>

구현하려는 코드는 이런 코드 입니다.

필요한 사전 지식 : what is DAO + 인터페이스 다형성 + 파일 내용 읽기 + 소스 계층표현(source hierarchy)

  1. 파일(db.properties)에 저장되어있는 문자데이터로 DB종류를 인지하여 인터페이스를 구현한 하위 클래스 중에서 알맞은 클레스의 인스턴스를 생성해서 하위 클레스의 메소드를 작동 시킵니다.
    1. UserInfoWeb : DB의 종류, 명세가 저장되어 있는 영역입니다.
    2. UserInfoDao : DB에 사용자의 데이터를 넣고 뺴고 수정 할수 있습니다.
    3. UserInfoDao 하위 클레스 : DB의 종류를 인지하고 종류에 따라서 실행 시킵니다.
    4. db.properties : DB의 종류에 대한 내용만을 갖고 있는 파일 입니다.
    5. DB: 실제로는 만들지 않고 하위 클레스에서 콘솔로 메소드 입력결과를 출력합니다.
  2. 코드의 계층 구조는 이렇습니다

패키지 하이러키((source hierarchy) : 페키지 내의 코드를 파일 구조로 표현

하이러키 식으로 코드 계층 만드는 방법

# 페키지 생성 단축키: ctrl+N → pa;

  1. pakage 생성
  2. pakage.domain 생성
  3. pakage명.domain.userinfo 생성

결과


전문 용어


 

에러 메세지


 

캠 스터디


공부 모임

1) 카카오톡 오픈 채팅방

  - 모르는것을 질문하거나

  - 이해가 가지 않는 부분을 다른 분들의 블로그에서 참고하기 용도

2) 구루미 온라인 독서실

  - 학습 시간을 관리 하거나 경쟁 하는 용도 

 

온라인 강의 주소

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

 

 


3:1:01 ~ 3:1:13

인터페이스 _ii

  • 연결점 : TV(객체1) ↔ 리모콘(인터페이스) ↔ 사용자(객체2)
  • 객체 혹은 프로그램이 재공하는 기능을 다른 사용자 혹은 개발자(클라이언트)가 코드를 보지 않고도 사용(다른 객체, 혹은 즉시)할수 있을 정도로 눈에 잘 보이게(명시적으로) 입력과 출력 도구를 제공 하는 것이다.
    • 인터페이스를 잘 사용한다면: 재사용성이 높아진다. 공유로 다른 사람이 사용하기에 편하게 코드를 만들수 있다. (Git hub에서 다른사람들이 많이 사용하는 소스를 만든다 : 1) 인터페이스를 잘사용한다 2)가독성이 좋다. 3)코드 영역별로 의미부여가 잘 되어있어서 복합적인 이해로 인한 어려움이 줄어든다.)
  • 인터페이스에는 이런 기능이 재공된다 라는 명시화가 되어있는데로. 인터페이스가 제공하는 기능에는 계약적 책임이 생긴다. ( 명세 한다 )
  • 예 ) 자바 > 인터페이스 > SQL
    • 인터페이스 : 자바의 커넥션 혹은 프레임워크가 실제로 인터페이스 객체로 명세가 되어있고 명세는 사용법이 문서화 되어있는 자료 파일(라이브러리) 를 제공하는것이 일반적이다.
      • 코드를 보지 않고 사용법의 문서만 보고 사용할수 있게 만드는 방법도 있다.

스트래티지 패턴 : 인터페이스의 다형성 : 호환성

하나의 인터페이스를 여러 하위 클레스에서 구현 할때 인터페이스의 내용을 바꿔서 사용할수 있는 기능을 이용해서. 호환성이나 선택 분기점을 생성할수 있습니다.

사용 예시 )

  1. 계산기 프로그램을 만들어서 1)윈도우 2)리눅스 3)유닉스 4)웹 환경을 인지하여 환경에 맞는 UI나 리소스를 사용하도록 작성할수 있습니다.
  2. DB에 입력되는 데이터가 1)오라클 2)mysql 3)mssql 등의 DB 버전별, DB종류에 따라서 다르게 입력되도록 호환성을 높일수 있습니다.
  3. 한번 작성한 글이 티스토리,워드프레스,GITPAGE 등으로 각각 디자인을 유지한체 다른 문서 입력규격 으로 입력되게 할수 있습니다.
  4. 키워드는 하나의 기능을 다양한 방법으로 선택에 의해 처리할수 있도록 할수 있는것에 있습니다.

예제 코드 작성은 내일 이어서..


전문 용어


 

에러 메세지


학습 시간


 

캠 스터디

포켓몬 시점에서 본 컨샙

 


공부 모임

1) 카카오톡 오픈 채팅방

  - 모르는것을 질문하거나

  - 이해가 가지 않는 부분을 다른 분들의 블로그에서 참고하기 용도

2) 구루미 온라인 독서실

  - 학습 시간을 관리 하거나 경쟁 하는 용도 

 

온라인 강의 주소

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

 

 


3:1:01 ~ 3:1:13


이론 정리

<복습_인터페이스>

인터페이스 클레스 내의 모든 메소드는 public abstract 로 변환

인터페이스 클레스 내의 모든 변수는 public static final 로 변환

인터페이스 클레스 만드는 방법

class 대신에 interface를 붙인다.

public interface interfaceClass{

}

인터페이스 객체를 구현(상속받는) 하는 방법

implement를 상속의 extends처럼 사용한다.

  • 상속과 다르게 하나의 인터페이스를 여러 클레스가 구현할수 있다.
public class implementClass implement interFaceClass{
// 가상 메소드를 구현 하거나. 스스로를 가상 클레스로 만들어서 하위 클레스에서 가상메소드를 
// 전부 구현함으로서 인스턴스를 만들수 있는 객체를 만들거나 한다.
}

UML과 다이어그램에서 인터페이스 작성법

(점선) + (속이 빈 화살표) : 화살표의 세모 옆에 implement(구현) 이라고 더 확인하기 쉽게 적어 놓기도 한다.

<CODE TEST> 

  1. interface 내에 default,private 이외의 메소드에 구현부의 중괄호를 입력하면 오류가 발생한다.

  • 인터페이스내의 변수는 아무것도 붙여주지 않아도 static final이 붙는걸 확인할수 있었다.

  • 아래 코드(code1)와 같이 interface A> abstract implement B > extends C 로 메소드 구현 책임을 넘길수도 있었다.
  • C는 A의 타입을 상속받았다 라고 표현하기도 한다( 상위 클레스는 하위 클레스의 값을 담을수 있기 때문에 타입을 상위클레스로 규격화 할수 있다. )

<code1>

package TEST;

public class Do {
	public static void main(String[] args) {
		Sub_Sub S = new Sub_Sub();
		S.SuperMethid();
	}
}
package TEST;

public class Sub_Sub extends Sub {

	@Override
	public void SuperMethid() {
		System.out.println("Sub_Sub_SuperMethod");
		
	}
	
}
package TEST;

public abstract class Sub implements Super {

	@Override
	public abstract void SuperMethid();
	
}
package TEST;

public interface Super {
	abstract void SuperMethid();
};

인터페이스의 특징

  • 다중 구현(상속)이 가능하다. : implement하는 클레스가 많을수 있다.
    • 상속이 가능한 메소드와 변수에 접근하는 하위클레스들이 서로 언제 호출하고 입력하는지 모호하기 때문이며. 인터페이스는 변수는 상수타입이고 메소드는 구현부가 없기 때문에 하위 클레스에서 값을 전달하여 저장할수 없기 때문이다.

전문 용어


 

에러 메세지


학습 시간


 

캠 스터디

`


공부 모임

1) 카카오톡 오픈 채팅방

  - 모르는것을 질문하거나

  - 이해가 가지 않는 부분을 다른 분들의 블로그에서 참고하기 용도

2) 구루미 온라인 독서실

  - 학습 시간을 관리 하거나 경쟁 하는 용도 

 

온라인 강의 주소

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

 

 


3:1:01 ~ 3:1:13


이론 정리

<탬플릿 메서드 패턴>

  • 추상 클레스추상 메소드를 이용해서 탬플릿 클레스를 제작할수 있다.
  • 문서의 서식 처럼 코드의 흐름이나 반복적으로 사용하는 구조를 자동화 하기 위해서 메서드의 이름만 선언한후 선언한 메서드를 묶어서 관계와 순서를 정의하며. 메서드의 자세한 내용은 나중에 정의하는 것이다.
    • 일정한 퀄리티와 하위 클레스에서 영향을 받는 흐름의 제어 등을 하기 편리해 질것 같다. - (내 생각)
      • 예를 들어서 문서에 기본적으로 포함되는 작성일> 제목 > 본문 > 인사말 처럼 반복되는 구조나 흐름을 정의해 놓고 반복적인 설계의 단계를 자동화 하는 기능이다. - (내생각)
    • 초보 프로그래머가 다루는 영역은 사실 서식이 만들어져 있는 문서의 내용을 채우는 것이 빝칸체우기가 일반적인 출발선 이다 -(페스트캠퍼스 자바 기초강의)
  • 클레스를 final로 정의하여 하위 클레스에서 메소드와 변수의 내용을 재정의 할수 없게 한다.
  • 프레임워크의 기본적인 형태 이다.
  • 상속받는 클레스들에서 공통적 으로 사용되는 메소드는 탬플릿 클레스에서 구현부를 정의하고.
    • 일부적인 하위 클레스에서 재정의 하게 할수도 있다.
    • 재정의가 위험한 결과를 불러올수 있는 메서드의 경우(리턴값이 꼭 필요한 경우등) final 로 메서드의 재정의를 막을수 있다.
  • 상속받는 객체의 특성으로 인해 사용하지 않는 메소드는 구현부를 빈칸으로 넣어 아무기능도 없게 제작한다.

final class <TEST code>

final class의 속성은 내부의 맴버 변수를 final 속성으로 만들지는 않기 때문에. 내부의 값에 접근해서 변경할수는 있다.

package abstractClass;

public class Do {
	public static void main(String[] args) {
		SubClass_A A =new SubClass_A();
		SubClass_B B =new SubClass_B();
		
		System.out.println("==SubClass_A의 인스턴스.doing : method 결과==");
		A.doing();
		System.out.println();
		System.out.println("==SubClass_B의 인스턴스.doing : method 결과==");
		B.doing();
		staticFinalClass.finalInt_A = 100;
		System.out.println(staticFinalClass.finalInt_A);
	}
}
package abstractClass;

public class SubClass_A extends Super {

	@Override
	void method_1() {
		System.out.println("call SubClass_A method");
	}

	@Override
	void methodOnlysubClass_A() {
		// 메서드 훅으로 작동 되지 않게 구현부를 비워 놓는다.
	}
	

}
package abstractClass;

public class SubClass_B extends Super {

	@Override
	void method_1() {
		System.out.println("call SubClass_B method");		
	}

}
package abstractClass;

public abstract class Super {
	//탬플릿 메소드 : 코드의 흐름 : 설계
	final void start() {
		System.out.println("공통_재정의_금지: 프로그램이 작동된다");
	}
	//ㄴ공통 작동 영역 : final로 재정의 될수 없다.
	abstract void method_1();
	//ㄴ개별 메서드 구현 영역
	void methodOnlysubClass_A() {
		System.out.println("SubClass_B에서만 작동 된다");
	}
	//ㄴ 공통으로 작동되는 코드지만 훅 메소드로 작동시키지 않을수 있다.
	void doing() {
		start();
		method_1();
		methodOnlysubClass_A();
		
	}
}
package abstractClass;

public final class staticFinalClass {
	static int finalInt_A = 1;
}

<인터페이스>

  • 추상 메서드 로만 구현되어 있다. (구현 코드가 없었습니다. 얼마 전까지는 ^^.)
    • 버전8 부터default,static,private처럼 메소드에 구현부가 있는 문법이 생겨 났습니다.
  • 인터페이스로 선언한 클레스의 메소드들은 추상 메소드로 변환 됩니다. abstract 를 메소드에 선언하지 않아도 프리 컴파일 단계에서 모든 메서드에 public abstract 가 자동으로 붙습니다.
  • 인터페이스로 선언한 클레스의 맴버 변수들은 상수로 변환 됩니다. 프리 컴파일 단계에서 자동으로 public static final 이 붙게 됩니다.
    • precompile(미리 컴파일)이란?
      • 컴파일 전에 수행하는 작업으로 라이브러리를 불러오거나 SQL을 DB에 연결

인터페이스의 정의는 내일 이어서 !


전문 용어


 

에러 메세지


학습 시간

 


 

캠 스터디


공부 모임

1) 카카오톡 오픈 채팅방

  - 모르는것을 질문하거나

  - 이해가 가지 않는 부분을 다른 분들의 블로그에서 참고하기 용도

2) 구루미 온라인 독서실

  - 학습 시간을 관리 하거나 경쟁 하는 용도 

 

온라인 강의 주소

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

 

 


3:1:01 ~ 3:1:13


이론 정리

<추상 클래스>

  • 추상 메소드의 구현부를 구현해야하는 책임이 있는 서브 클레스도 추상클레스로 만들면 서브 클레스를 상속받는 sub의 sub클레스에 구현해야하는 책임을 넘겨 줄수 있습니다.
	package abstract_2;

public abstract class Super {
	abstract void Do();
}
package abstract_2;

	public abstract class Sub extends Super {
		 
}
package abstract_2;

public class Sub_Sub extends Sub {
	@Override
	void Do() {
		System.out.println("추상 클레스 호출 완료 ^^!");
		//상위 클레스의 메소드를 구현 해야하는 책임은 하위 클레스에 있습니다.
		// ㄴ 하위 클레스에서 추상클레스의 메소드를 구현하지 않는다면 . 하위 클레스 또한 추상 클레스로 제작하면 됩니다.
		//jdk 안에는 많은 추상 클레스와 , 인터페이스가 있습니다.
		//ㄴ 이런것을 프레임워크 라고 하기 때문에. 프레임워크를 떠올려볼수 있습니다.
	}
}
  • 추상 클레스는 내부가 비어 있어도 그 자체만으로도 인스턴스가 만들어지는것이 막힌다.
    • 내부에 저장할수 있는 값을 품고 있지 않기 때문에 다수의 존제가 불필요 합니다. (하나만 있어도 충분) . - 메모리의 소모가 증가하고, 컴파일러가 모호한 기능을 이해하기에 부족하기 때문 - (headfirst JAVA) 
  • 추상 클레스를 기반으로 배열 종류의 오브젝트로 만드는것은 가능.
    • 내부에 무언가는 들어 있기 때문.
  • 추상 메소드가 하나라도 있는 클레스는 클레스를 추상 클레스로 선언 해야 한다.
  • 추상 메소드를 구현하는 하위 클레스에서 메소드의 구현부를 비워 놓는 더미 메소드를 훅 메소드 라고 한다.
  • 추상 클레스의 반대 계념 : 구상 클레스 : Concrete Class : 구체 클레스
    • 인스턴스를 만들어도 괜찮을정도로 구체적인 클레스.

추상 클레스를 사용하는 상황

  • 설계 . 하위 클래스에서 어떤 모습으로 혹은 순서대로 구현 되는지 규약(Protocol)을 정의하는것.
  • 인터페이스를 정의할때
  • 공통으로 사용할 메서드를 구현부까지 정의하고 나머지는 추상메서드로 남겨 놓을때.
    • 공통으로 사용할 메서드 중에서도 변경이 필요할떄는 오버라이드
    • 변경하면 않되는 메소드는 final 로 정의한다.
      • class 도 final 로 선언하면 상속받을수 없다.
      • static final 변수는 클레스에 static 이 없어도 class명.변수명 으로 모든 클레스에서 접근할수 있다.

추상클레스로 설계 했을때의 장점

  • 코드의 재사용성이 늘어난다 ( 문서 서식처럼 기본적인 방향을 만들어 놓고 미리 만들어진 구체적인 기능을 조합시키거나 세부적 내용을 재작할수 있다 - 프레임 워크 )

전문 용어


 

에러 메세지


학습 시간

스케줄 중간 중간에 학습 하느라 정신이 없어서 시간 측정 실패함 히잉. .ㅠㅠ-


 

캠 스터디


공부 모임

1) 카카오톡 오픈 채팅방

  - 모르는것을 질문하거나

  - 이해가 가지 않는 부분을 다른 분들의 블로그에서 참고하기 용도

2) 구루미 온라인 독서실

  - 학습 시간을 관리 하거나 경쟁 하는 용도 

 

온라인 강의 주소

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

 

 

+ Recent posts