** Package와 Import
1. Package
=> 관련있는 클래스와 인터페이스의 집합
=> Java에서 배포의 최소단위
=> 독립적으로 실행 단위는 method인데 Java는 method만 단독 생성할수 없으므로
class내에 method를 만들고 class들을 하나의 파일에 저장 할 수 있음
=> 일반적으로 Java에서는 파일단위가 아닌 Package 단위로 배포
=> Package는 디렉토리와 유사하지만 디렉토리는 아님
1) 패키지 이름 규칙
=> 처음 2~3개는 회사 도메인이나 이메일 주소사용
=> 마지막은 기술, 프로젝트명 기술
=> 모두 소문자로 기술하는 것을 권장
=> Java 패키지는 jar 파일로 압축하여 배포(jar은 자바, zip은 파이썬에서 압축 해제없이 사용 가능)
(tar은 linux(Android)나 Unix(Apple)에서 압축 표준)
2) 자바에서 패키지 기재
=> 특정 패키지에 클래스 제작시 파일 최상단에 package 소속; 을 입력해야 함
2. import
1) 패키지명을 생략한 경우 자바 프로그램이 클래스를 찾는 순서
(1) 현재 작업중인 클래스의 패키지에서 찾음
(2) 현재 프로젝트에 속해있는 패키지에서 찾음
(3) 자바가 기본적으로 제공하는 패키지에서 찾음
(4) 외부에서 추가한 패키지에서 찾음
2) import
=> 패키지 이름을 생략하고 클래스 이름만으로 클래스를 사용하기 위한 명령어
=> C#에서의 using namespace 와 유사
=> 패키지 전체 import(import 패키지명.*; - 패키지명에 속한 모든 클래스를 패키지명 없이 사용 가능
ex) import java.util.*;
Scanner sc = new Scanner(System.in);
Random r = new Random();
=> 특정 클래스나 상수만 import(static import)
import 패키지명.클래스명
import 패키지명.클래스명.final상수(지정된 클래스만 패키지명 생략가능)
import java.util.Scanner;
Scanner sc = new Scanner(System.in);
Random r = new Random(); //에러발생
=> 서로 다른 패키지에 동일한 이름의 클래스가 존재하는 경우
(java.util.Date, java.sql.Date가 있는 경우 2개의 클래스를 모두 사용하려면 하나만 import 나머지는 적어서 사용
import java.util.*;
Date d1 = new Date(); //java.util.Date
java.sql.Date d2 = new java.sql.Date(); //java.sql.date
=> java.awt, java.awt.event 패키지가 있는 경우 2개의 패키지는 전혀 다른 패키지
=> import java.awt.*; //이렇게 해도 java.awt.event 패키지에 있는 클래스는 전체 이름을 전부 입력해야함
=> eclipse나 Intelli J 같은 IDE들은 클래스명만 사용한 경우 현재 패키지에 존재하지 않는 클래스이면 에러를 표시, 패키지를 import해준다고 메시지 출력하므로 import구문은 직접 입력하지 않고, 메시지를 클릭해서 할수 있음
3. Library & Framework
=> Library : Program을 쉽게 개발할 수 있도록 도와주는 파일이나 파일의 집합
=> Framework : Library의 집합이나 program을 쉽게 개발 할 수 있도록 도와주는 프로그램
=> solution : 특정 목적의 프로그램을 개발하기 쉽도록 해주는 프로그램 or framework
** 상속(Inheritance)
=> 상위 클래스의 모든 것을 하위 클래스가 전부 물려받는 것
1. 상속의 장점
=> 재사용을 하기 때문에 코드가 간결해짐
2. 상속의 단점
=> 유지보수가 어려워질 수 있음
3. 상속의 목적
1) 여러 클래스를 만들어서 사용하는 경우 공통되는 내용을 상속받기위해(코드를 간결하게)
2) Framework에서 제공하는 클래스의 기능이 부족해서 기능을 추가하기 위해 - SubClassing
3) 템플릿 메소드 패턴을 구현하기 위해서
=> 특정 메소드가 존재하는다는 것을 보장하기 위해서
4. 상속의 종류
1) 단일 상속 : 하나의 클래스로부터 상속
2) 다중 상속 : 2개 이상의 클래스로부터 상속
=> java는 단일 상속만 지원
=> java는 명시적으로 상속받는 문장을 표현하지 않으면 java.lang.object 클래스로부터 상속받는 것으로 간주
5. 상속 용어
1) 상속하는 클래스 : super class, base class
2) 상속받는 클래스 : sub class, drived class
=> parent와 child의 개념을 사용하지 않는 것을 권장
6. 상속 받는 방법
=> 형식 class 클래스명 extends 상위 클래스명{ (내용) }
=> 모든 맴버가 상속되지만 private 멤버는 하위 클래스에서 접근 할 수 없음
=> 초기화 블럭과 생성자는 상속되지 않음
=> 동일한 이름의 property(변수)가 상위, 하위 클래스에 존재시, public이라도 인스턴스를 이용하여
상위 클래스의 property에 접근 불가
=> static property는 상속됨
=> 상위 클래스의 내용을 가지고 먼저 인스턴스를 만들고 하위클래스의 내용을 추가하는 형태로 인스턴스 생성
7. super
1) super
=> 하위클래스의 인스턴스 메소드(static이 붙지 않은 메소드)에서 상위 클래스의 인스턴스를 가리키는 포인터
=> super. 을 하게되면 상위클래스에서 만든 것들이 보여짐
=> 상위, 하위 클래스에 동일한 이름의 프로퍼티나 메소드가 있는 경우 하위 클래스의 메소드에서 상위 클래스의
프로퍼티나 메소드를 호출하기 위해 사용
2) super(매개변수)
=> 하위 클래스의 생성자에서 상위 클래스의 생성자를 호출하는 방법
=> 하위 클래스의 생성자에는 코드를 작성하지 않아도 상위 클래스의 Default Constructor를 호출하는 super()가
가장 위에 존재하는 것으로 간주(직접 호출시 기본 super()는 소멸)
=> 상위 클래스의 Default Constructor가 없을때 상속시 에러(하위 클래스에 생성자 제작후 super(매개변수)를 호출)
=> super(매개변수)는 첫째 줄에 나와야 하고 1번만 나와야 함
3) 에러 메시지 해결
(Implicit super constructor Employee() is undefined for default constructor. Must define an explicit constructor)
=> 매개변수가 없는 생성자를 가지지 않은 클래스로부터 상속받은 경우 보여지는 메시지
=> 해결 : 생성자를 만들어서 명시적으로 상위 클래스 생성자를 호출해야 함
8. Method Overriding(메소드 재정의)
=> 상위 클래스에 존재하는 메소드를 하위 클래스에서 다시 정의하는 것
=> Overloading은 이름은 같으나 매개변수의 갯수, 자료형이 다른 경우
Overriding은 이름, 매개변수의 갯수 및 자료형도 동일한 경우
=> 목적은 상위 클래스에서 제공되는 메소드의 기능이 부족해서 기능을 추가하는 것
=> 이러한 이유로 상위 클래스의 메소드의 내용이 존재하는 경우, 반드시 상위 클래스이 메소드를 호출해 주어야 함
(메소드의 기능이 파괴라면 자신의 코드를 작성 후 상위 클래스의 메소드 호출
메소드의 기능이 파괴가 아니면 상위 클래스의 메소드를 호출하고 자신의 코드를 작성)
=> 안드로이드에서 상위 클래스의 메소드를 호출하지 않으면 에러가 발생, IOS에서는 특정 동작 미수행 할수 있음
9. 참조형 변수의 대입
=> 자료형은 기본형과 참조형으로 구분
=> 기본형 : 하나의 데이터만 저장
참조형 : 0개 이상의 데이터를 묶어서 heap에 할당하고 그 참조를 저장
(기본형 변수에 참조형 데이터를 저장할 수 없고, 참조형 변수에 기본형 데이터를 저장할 수 없음)
=> 기본형의 경우 boolean을 제외하고는 형변환을 이용해서 서로간에 대입할 수 있음
=> 참조형은 상속 관계인 경우만 서로 다른 자료형 간에 대입이 가능
=> 상위 클래스 타입으로 만들어진 변수에 하위 클래스 타입의 인스턴스 참조를 형변환 없이 대입할 수 있음
=> 하위 클래스 타입으로 만들어진 변수에 상위 클래서 타입의 인스턴스 참조는 강제 형변환 없이는 대입 불가
(강제 형변환 후 대입시 프로그래머 책임, 이 의미는 강제 형변환되는 인스턴스가 하위 클래스 타입의 생성자를 호출하여 만들어지는 경우는 문제 X, 그 외에는 예외 발생)
=> 객체 지향 언어의 가장 중요한 성질 중 하나, API Document를 읽을 때 가장 중요한 부분
10. Polymorphism(다형성)
=> 동일한 메시지에 대하여 다르게 반응하는 성질
=> 동일한 코드가 대입된 인스턴스에 따라 다른 메소드를 호출
=> 참조형 변수가 프로퍼티나 메소드에 접근시, 생성자로 판단하지 않고, 변수생성시 사용한 클래스를 가지고 판단
=> 예외 : Overrding된 메소드는 변수 만들때 사용한 클래스가 아닌 인스턴스 생성시 호출한 생성자를 가지고 판단
(이것을 가지고 다형성 구현)
11. abstract
1) abstract class(추상 클래스)
=> 인스턴스를 생성하지 못하는 클래스
=> 변수를 선언할 수 있지만 생성자를 호출하지 못하는 클래스
=> 다형성 구현을 위해서 만들어진 클래스
2) abstract method(추상 메소드)
=> 내용이 없는 메소드
=> 자바에서 이 메소드는 추상 클래스나 인터페이스에만 존재해야 함
=> 상속받은 클래스에서는 반드시 overriding 해서 내용을 만들어야 함
=> 메소드의 결과형 앞에 abstract를 추가
12. Overriding 에서 주의 사항
1) Method Overriding을 할 때 하위 클래스에서의 접근 지정자가 상위 클래스에서보다 크거나 같아야 함
(public > protected > package(생략) > private / set > get
=> 오버라이딩은 근본적으로 기능을 확장하는 개념
2) 오버라이딩 된 메소드라는 것을 명시적으로 표현하기 위해 @Override라는 어노테이션을 사용할 수 있음
(이 어노테이션이 붙은 메소드가 상위 클래스에 존재하지 않을 시 에러)
- annotation : 컴파일이나 실행시 프로그래밍 언어의 코드로 변경되어 특별한 기능을 수행해주는 명령어
13. Interface(ex - 음식점 메뉴판(메뉴판에 있는 음식은 반드시 제공될수 있지만 직접 실물을 보지는 않는다))
=> final상수와 abstract method, default method를 가진 것으로 protocol이라고 하기도 함
=> 클래스를 만들때 사용하는 class라는 예약어 대신 interface라는 예약어를 사용해서 생성
=> 변수를 만들 때 final을 붙이지 않아도 자동으로 final이 추가되어 값 변경 불가
=> 메소드를 만들때 abstract를 붙이지 않아도 자동으로 abstract가 추가 되어 추상메소드가 됨
1) 생성 : interface 인터페이스명 { int TEN = 10; //final이 자동으로 추가
public void method(); } //abstract가 없어도 추상 메소드
2) class에서 가져다 사용
class class명 extends 상위 클래스명 implements 인터페이스명 나열{ }
=> extends 보다는 뒤에 와야하고 여러개를 implements 할수 있음.
3) 인터페이스도 추상 클래스처럼 변수를 만들수는 있지만 인스턴스 생성은 못함
4) 인터페이스는 여러개 구현 가능
5) Default Method
=> 인터페이스에 내용이 있는 메소드를 필요로 할 때 사용
=> 이 메소드는 접근 지정자를 public, protected, private 대신 default로 기재
=> 이 메소드는 추상 메소드가 아니라 클래스에서 구현하지 않아도 됨(추상메소드는 하위 클래스에서 무조건 구현)
=> 목적
(1) Default Method는 재정의(O)시 재정의한 기능, 재정의(X)시 기본기능(*default method는 선택적 구현이 가능*)
(2) 유지보수시 인터페이스에 추상 메소드를 만들면 기존의 인터페이스를 구현한 모든 클래스가 이 메소드를
만들어야 하지만 default method로 추가시 기존 클래스를 만들지 않아도 에러가 발생하지 않음
6) 인터페이스도 상속 가능
=> 인터 페이스가 다른 인터페이스에 상속 가능
=> implements 대신에 extends를 이용해서 상속
7) Template Method Pattern
=> Business Logic(Service) 구현시, 고객의 요구사항을 Interface를 이용하여 표현, Interface를 implements한
클래스에서 내용을 만드는 방식
=> 자바에서는 인터페이스를 이용하여 구현, swift에서는 protocol을 이용하여 구현
자바는 Objective-C에서 파생되어 protocol이라 부르다가 고객의 요구사항을 표현한다는 의미로 Interface라고 표현
8) 프로그래머들은 클래스 상속시 뒤에 ex를 붙이고, 인터페이스를 implements하는 경우 impl을 붙이는 경우가 많음
(JDK에서는 Listener, able로 끝나는 이름은 무조건 인터페이스, Adapter로 끝나는 이름은 추상클래스)
14. final
1) final class : 상속을 할 수 없는 클래스
=> 시스템과 관련된 중요한 클래스는 상속시 시스템에 문제가 발생 할 수 있기에 상속 불가
2) final method : 오버라이딩 할 수 없는 메소드
=> 시스템과 관련된 중요한 메소드는 오버라이딩시 시스템에 문제가 발생 할 수 있기에 오버라이딩 불가
3) final variable : 변수의 값을 변경할 수 없도록 한 것(변수의 상수화 - 읽기전용 데이터)
=> 변경할 수 없도록 하기 위해 생성하거나, 클래스 내에서 사용할 옵션으로 사용하기 위해 생성
=> 이름을 만들때 모두 대문자로 하는 것이 관례
**클래스들 사이의 관계
=> 기본적으로 하나의 프로그램에 사용된 모든 클래스들은 타 클래스와 관계를 가져야 함
1. is a 관계(상속) - 추상,
2. has a 관계(포함)
1) 타 클래스의 인스턴스를 가지고 메소드를 호출하기 위해 생성
2) 타 클래스들의 인스턴스를 모아 새로운 하나를 만들기 위해 생성
** Business Logic 구현 방법
=> 항공권 티켓팅하는 기능을 구현의뢰
1. Service 인터페이스를 만들고, 티켓팅하는 메소드를 선언(이때, 고객에게 만들어달라고 하는 메소드가 맞는지 확인)
리턴타입은 결과이고, 매개변수는 메소드를 수행하기 위해서 필요한 데이터
티켓팅을 하려면 고객의 ID, PW가 필요하고, 결과는 성공, 실패가 나와야 함
2. Service 인터페이스를 implements 한 클래스를 만들고 티켓팅하는 메소드를 구현
3. 유저 인터페이스와 메소드를 연결
'수업 정리' 카테고리의 다른 글
12일차 수업 정리(Exception, Debug, try~catch) (0) | 2020.04.22 |
---|---|
11일차 수업 정리(Nested Class, Singleton, Sort) (0) | 2020.04.21 |
9일차 수업정리(module, Recursion, Constructor) (0) | 2020.04.17 |
8일차 수업 정리(Class, 변수, Method) (0) | 2020.04.16 |
7일차 수업 정리 (0) | 2020.04.14 |