Java

10일차 공부 GarbageCollection, 패키지&임포트, 상속, super, Method Overriding, abstract, Interface, default method

이즈라핀 2020. 4. 20. 13:12

1 교시

 

GarbageCollention

 

자바는 가비지컬렉션이 heap 메모리를 정리

가비지컬렉션의 호출 시점은 우리가 알 수 없다.

강제로 호출해주는 System.gc()가 있지만 바로 호출되지 않을 수 있다.

우선순위가 낮아서 다른 직업이 수행 중이면 바로 호출되지 않는다.

자바에서는 메모리 정리를 하고 싶은 객체가 있으면 null을 대입해서 참조를 제거하면 참조가 없는 heap공간을 정리

null을 대입하면 객체의 finalize()가 호출되고 차후에 가비지컬렉션에 의해 heap에서 제거

(메모리 정리를 하고 싶으면 null을 대입하자.)

 

**package 와 import

1. package

=> 관련있는 클래스와 인터페이스의 집합

=> 자바에서 배포의 최소단위

=> 독립적으로 실행되는 단위는 method인데 자바는 method만 단독으로 생성할 수 없어서 calss 안에 method를 만들고 class들을 하나의 파일에 저장할 수 있다.

=> 일반적으로 자바에서는 파일 단위로 배포하지 않고 package단위로 배포

package는 디렉토리와 유사하기는 하지만 디렉토리는 아니다.

 

 1) 패키지 이름 규칙

=> 처음2개나 3개는 회사 도메인이나 이메일 주소를 이용

=> 마지막은 기술 이름이나 프로젝트 이름

=> 모두 소문자로 기술하는 것을 권장

=> 자바 패키지는 jar 파일로 압축해서 배포

jar 파일은 자바에서는 압축을 해제하지 않고 바로 사용이 가능

=> zip은 파이썬에서는 압축을 해제하지 않고 사용 가능

=> tar는 Linux(Android) 나 Unix(Apple)에서 압축 표준

 

2) 자바에서 패키지 기재

=> 특성 패키지에 클래스를 만든 경우에는 파일의 최상단에 package 소속; 을 입력해야 한다. 

 

2. import

1) 패키지 이름을 생략한 경우 자바 프로그램이 클래스를 찾는 순서

=> 현재 작업 중인 클래스의 패키지에서 찾는다.

=> 현재 작업 중인 클래스의 패키지에 없으면 현재 프로젝트에 속해있는 패키지에서 찾는다.

=> 자바가 기본적으로 제공하는 패키지에서 찾는다.

=> 외부에서 추가한 패키지에서 찾는다.

 

2) import

=> 패키지 이름을 생략하고 클래스 이름만으로 클래스를 사용하기 위한 명령어

=> C#에서의 using namespace 와 유사

=> 패키지 전체 import

import 패키지이름.*;

패키지이름에 속한 모든 클래스를 패키지이름을 생략하고 사용하는 것이 가능

 

java.util.Scanner sc = new java.util.Scanner(System.in);

java.util.Randim r = new java.util.Random();

 

import java.util.*;

Scanner sc = new Scanner(System.in);

Randim r = new Random();

 

=> 특정 클래스나 상수만 import - static import

import 패키지이름.클래스이름

import 패키지이름.클래스이름.final상수

지정된 클래스만 패키지 이름 생략 가능

import java.util.Scanner;

Scanner sc = new Scanner(System.in);

Randim 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 : 특정 목적의 프로그램을 개발하기 쉽도록 해주는 프로그램 또는 Framework

 

 

 

2~3 교시 

 

**상속(Inheritance)

=> 상위 클래스의 모든 것을 하위 클래스가 전부 물려받는 것

 

1. 상속의 장점

=> 재사용을 하기 때문에 코드가 간결해짐

 

2. 상속의 단점

=> 유지보수가 어려워 질 수 있다.

 

3. 상속의 목적

1) 여러 클래스를 만들어서 사용하는 경우에 공통된 내용이 있어서 공통된 내용을 상속을 받을 수 있도록 하기 위해서 - 코드를 간결하게 하기 위해서

 

2) Framework에서 제공하는 클래스의 기능이 부족해서 기능을 추가하기 위해서 - SubClassing

 

3) 템플릿 메소드 패턴을 구현하기 위해서

=> 특정 메소드가 존재한다는 것을 보장하기 위해서

 

4. 상속의 종류

1) 단일 상속 : 하나의 클래스로부터 상속

2) 다중 상속 : 2개 이상의 클래스로부터 상속

=> java는 단일 상속만 지원

=> java는 명시적으로 상속받는 문장을 표현하지 않으면 java.lang.Pbject 클래스로부터 상속받는 것으로 간주

 

5. 상속 용어

1) 상속하는 클래스 - super class, base class

2) 상속받는 클래스 - sub class, drived class

=> paren 와 child의 개념을 사용하지 않는 것을 권장

 

6. 상속받는 방법

class 클래스이름 extends 상위클래스이름{

          내용

}

=> 모든 멤버가 상속되지만 private 멤버는 하위클래스에서 접근할 수 없다.

=> 초기화블럭과 생성자는 상속되지 않는다.

=> 동일한 이름의 property(변수)가 상위 클래스와 하위클르스에 존재하면 public이라 할 지라도 인스턴스를 이용해서 상위 클래스의 property에는 접근이 안된다.

=> static property는 상속된다.

=> 상위 클래스의 내용을 가지고 먼저 인스턴스를 만들고 하위 클래스의 내용을 추가하는 형태로 인스턴스가 만들어진다.

 

 

 

 

4 교시

 

 

 

 

7. super

1) super

=> 하위 클래스의 인스턴스 메소드(static이 붙지 않은 메소드)에서 상위 클래스의 인스턴스를 가리키는 포인터

=> super. 을 하게 되면 상위클래스에 만든 것들이 보여지게 된다.

=> 상위 클래스와 하위 클래스에 동일한 이름의 프로퍼티나 메소드가 있는 경우 하위 클래스의 메소드에서 상위 클래스의 프로퍼티나 메소드를 호출하기 위해서 사용

 

2) super(매개변수)

=> 하위 클래스의 생성자에서 상위 클래스의 생성자를 호출하는 방법

=> 하위 클래스의 생성자에는 코드를 작성하지 않아도 상위 클래스의 Default Constructor를 호출하는 super()가 가장 위에 존재하는 것으로 간주한다.

직접 super()를 호출하면 기본적으로 제공되는 super()는 없어진다.

=>상위클래스에 Default Constructor가 없는 경우 상속을 받으면 에러가 발생하는데 이런 경우에는 하위 클래스에 생성자를 만들고 super(매개변수)를 호출해 주어야 한다.

=> super(매개변수)는 첫번째 줄에 나와야 하고 1번만 나와야 한다.

 

3) 에러 메시지 해결

Implicit super constructor Employee() is enderfined for default constructor. Must define an explicit constructor

=> 매개변수가 없는 생성자를가지지 않은 클래스로부터 상속받은 경우 보여지는 메세지

=> 이 문제를 해결하려면 생성자를 만들어서 명시적으로 상위 클래스를 생성자를 호출해야 한다.

 

8. Method Overriding(메소드 재정의)

=> 상위 클래스에 존재하는 메소드를 하위 클래스에서 다시 만드는 것

=> Overloading 은 이름은 같은데 매개변수의 개수나 자료형이 다른 경우이고 Overriding은 이름 그리고 매개변수의 개수 및 자료형도 동일한 경우이다.

=> 목적은 상위 클래스에서 제공되는 메소드의 기능이 부족해서 기능을 추가하는 것.

=> 이러한 이유로 상위 클래스의 메소드의 내용이 존재하는 경우라면 반드시 상위 클래스의 메소드를 호출해 주어야 한다. 메소드의 기능이 파괴하는 것이라면 자신의 코드를 먼저 작성하고 상위 클래스의 메소드를 호출하고 메소드의 기능이 파괴하는 경우가 아니라면 상위 클래스의 메소드를 호출하고 자신의 코드를 작성해야 한다.

=> 안드로이드에서는 상위 클래스의 메소드를 호출하지 않으면 에러가 발생하는 경우가 많고 iOS에서는 특정한 동작을 수행하지 않을 수도 있다.

 

 

super를 안붙이면 에러

 

 

5 교시

 

9. 참조형 변수의 대입

=> 자료형은 기본형과 참조형으로 구분

기본형은 하나의 데이터만 저장

참조형은 0개 이상의 데이터를 묶어서 heap에 할당을 하고 그 참조를 저장

기본형 변수에 참조형 데이터를 저장할 수 없고 참조형 변수에 기본형 데이터를 저장할 수 없다.

 

기본형의 경우는 boolean을 제외 하고는 형변환을 이용해서 서로 간에 대입할 수 있다.

 

=> 참조형은 상속관계인 경우만 서로 다른 자료형 간에 대입이 가능하다.

 

=> 상위 클래스 타입으로 만들어진 변수에 하위 클래스 타입의 인스턴스 참조를 형 변환없이 대입할 수 있다.

=> 하위 클래스 타입으로 만들어진 변수에 상위 클래스 타입의 인스턴스 참조는 강제 형변환 없이는 대입이 안된다. 이 경우에 강제 형변환을 해서 대입을 하면 책임은 프로그래머가 진다고 하는데 이 의미는 강제 형변환을 하고자 하는 인스턴스가 하위 클래스 타입의 생성자를 호출해서 만들어진 경우는 문제가 없는데 그 이외의 경우는 예외가 발생한다는 의미.

 

=> 객체 지향언어의 가장 중요한 성질 중 하나이고 API Document를 읽을 때 가장 중요한 부분이기도 하다.

 

10. Polymorphism(다형성)

=> 동일한 메시지에 대하여 다르게 반응하는 성질

=> 동일한 코드가 대입된 인스턴스에 따라 다른 메소드를 호출하는 것

=> 참조형 변수가 프로퍼티나 메소드에 접근할 대는 생성자를 가지고 판단하는 것이 아니고 변수를 만들 때 사용한 클래스를 가지고 판단한다.

단 하나의 예외는 Overriding 된 메소드이다.

Overriding 된 메소드는 변수를 만들 때 사용한 클래스를 가지고 판단하지 않고 인스턴스를 생성할 때  호출한 생성자를 가지고 판단한다.

이것을 가지고 다형성을 구현한다.

 

6 교시

 

11.abstract

1) abstract class (추상 클래스)

=> 인스턴스를 생성하지 못하는 클래스

=> 변수를 선언할 수 있지만 생성자를 호출하지 못하는 클래스

=> 다형성 구현을 위해서 만들어진 클래스

=> class 앞에 abstract를 추가

 

2) abstract method(추상 메소드)

=> 내용이 없는 메소드

=> 자바에서는 이 메소드는 추상 클래스나 인터페이스에만 존재해야 한다.

=> 상속받은 클래스에서는 반드시 overriding해서 내용을 만들어야 한다.

=> 메소드의 결과형 앞에 abstract를 추가

 

 

12. Overriding에서 주의 사항

1) Method Overriding을 할 때 하위 클래스에서의 접근 지정자가 상위 클래스에서보다 크거나 같아야 한다.

public > protected > package(생략) > private

set > get

=> 오버라이딩은 근본적으로 기능을 확장하는 개념이기 때문

 

2) 오버라이딩 된 메소드라는 것을 명시적으로 표현하기 위해서 @Override 라는 어노테이션을 사용할 수 있는데 이 어노테이션이 붙은 메소드가 상위 클래스에 존재하지 않는다면 에러

 

 

 

13. Interface

=> 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 클래스이름 extends 상위클래스이름 implements 인터페이스이름 나열{

 

}

=> extends 보다는 뒤에 와야 하고 여러 개를 implements 할 수 있다.

 

 

 

 

7 교시

 

 

 

 

 

 

 

 

 

3) 인터페이스도 추상 클래스 처럼 변수를 만들수는 있지만 인스턴스 생성은 못함

 

4) 인터페이스는 여러개 구현하는것이 가능

빨간 네모를 추가 하면 에러가 뜨는데 그 때 InterImpl에 마우스를 가져가면 add ...클릭하면 에러를 처리할 수 있다.

 

 

 

 

8 교시

 

 

5) default method

=> 인터페이스에 내용이 있는 메소드를 필요로 할 때 사용

=> 이 메소드는 접근 지정자를 public, protected, private 대신에 default로 기제

=> 이 메소드는 추상 메소드가 아니라서 클래스에서 구현하지 않아도 된다.

=> 목적은 추상 메소드는 하위 클래스에서 무조건 구현해야 하는데 dafault method는 재정의 하면 재정의 한 기능을 갖고 그렇지 않으면 기본 기능을 갖는다.

default method는 선택적 구현이 가능

또 다른 목적은 유지보수를 할 때 인터페이스에 추상 메소드를 만들면 기존의 인터페이스를 구현한 모든 클래스가 이 메소드를 만들어야 하지만 dafault method로 추가하면 기존 클래스는 만들지 않아도 에러가 발생하지 않는다.

 

6) 인터페이스도 상속 가능

=> 인터페이스가 다른 인터페이스에 상속 가능

=> implements 대신에 extends를 이용해서 상속

 

7) Template Method Pattern

=> Bussiness 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 인터페이스를 만들고 티켓팅하는 메소드를 선언

이 때 고객에게 만들어달라고 하는 메소드가 맞는지 확인

리턴타입은 결과이고 매개변수는 메소드를 수행하기 위해서 필요한 데이터이다.

 

티켓팅을 하려면 고객의 아이디와 비밀번호가 필요하고 결과는 성공과 실패로 나와야 한다.

 

2. Service 인터페이스를 implements 한 클래스를 만들고 티켓팅하는 메소드를 구현

3. 유저 인터페이스와 메소드를 연결