반응형

세상에 나쁜개는 없다

아빠를 왕따 시키는 개 정남이

























반응형
반응형

세상에 나쁜개는 없다

아기 질투하는 개 쪼꼬














반응형
반응형

세상에 나쁜개는 없다

청각장애견 올라프의 훈련기













반응형
반응형

세상에 나쁜개는 없다

떴다! 뭉치면 짖는 온새 & 미로










반응형
반응형

           

  JAVA Study







6. 추상클래스 (abstract class)


- 미완성 메서드(추상메서드)를 포함한 미완성 클래스 (추상메서드가 없어도 키워드를 붙여 추상클래스로 지정 가능)


- 추상클래스 자체로는 클래스로서의 역할을 다하지 못함, but 새로운 클래스를 작성할 때 바탕이 되는 조상클래스로서 중요한 의미를 가짐


- 추상클래스는 키워드 abstract를 붙이기만 하면 됨


- 추상클래스에도 생성자는 존재, 멤버변수와 메서드도 가질 수 있음


- 추상메서드 없이 완성된 클래스여도 추상클래스로 지정되면 클래스의 인스턴스를 생성할 수 없음


- 추상 메서드 

: 선언부만 작성하고 구현부는 작성하지 않은 메서드

: 실제 내용은 상속받는 클래스에서 구현하도록 비워둠

: 키워드 abstract를 앞에 붙여줌, 구현부가 없으므로 {}대신 ;을 붙임

: 추상클래스를 상속받은 자손클래스에서 오버라이딩을 통해 추상클래스의 추상메서드들을 모두 구현해야 함

- 만약 하나라도 구현하지 않으면 자손클래스역시 추상클래스로 지정해주어야 함


- 추상클래스 작성

: 여러 클래스에 공통적으로 사용될 수 있는 클래스를 바로 작성

: 기존 클래스의 공통 부분을 뽑아 조상클래스를 만듦

: 추상화 - 클래스간의 공통점을 찾아내 공통의 조상을 만드는 작업

: 구체화 - 상속을 통해 클래스를 구현, 확장하는 작업



7. 인터페이스 (interface)


- 일종의 추상클래스, 추상메서드를 갖지만 추상클래스보다 추상화정도가 높아 추상클래스와달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없음


- 오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 다른 어떠한 요소도 허용하지 않음


- 인터페이스 작성

: 인터페이스를 작성하는 것은 클래스 작성과 같다, 키워드로 class 대신 interface를 사용한다

: 접근제어자로 public 또는 default를 사용할 수 있다.


interface 인터페이스 이름 {

public static final 타입 상수이름 = 값;

public abstract 메서드이름(매개변수목록);

}


: 인터페이스 제약사항

- 모든 멤버변수는 public static final 이어야하며, 이를 생략할 수 없음

- 모든 메서드는 public abstract 이어야하며, 이를 생략할 수 없음 (단, static메서드와 default메서드 제외)


- 인터페이스 상속

: 인터페이스는 인터페이스로부터만 상속받을 수 있음, 다중상속 가능

: 자손 인터페이스는 조상 인터페이스에 정의된 멤버를 모두 상속받음


- 인터페이스 구현

: 그 자체로는 인스턴스생성할 수 없음 -> 인터페이스를 구현하는 클래스를 작성해야 함 

: implements를 사용해 구현하는 인터페이스의 메서드 중 일부만 구현한다면 abstract를 붙여서 추상클래스로 정의해야 함

: 상속 (extends)과 구현(implements)을 동시에 할 수 있음


class Fighter extends Unit implements Fightable{

}


- 인터페이스를 이용한 다중상속

: 인터페이스는 static상수만 정의할 수 있으므로 조상클래스의 멤버변수와 충돌하는 경우는 거의 없고 충돌된다 하더라도 클래스 이름을 붙여서 구분이 가능함


- 인터페이스를 이용한 다형성

: 인터페이스 타입의 참조변수로 이를 구현한 클래스의 인스턴스를 참조할 수 있으며, 인터페이스 타입으로 형변환 가능

: 인터페이스 타입의 매개변수가 갖는 의미는 메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야 한다는 것

: 리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미


package apple;


interface Parseable{

// 구문 분석작업을 수행

public abstract void parse(String fileName);

}


class ParserManager{

// 리턴타입이 Parseable인터페이스

public static Parseable getParser(String type){

if(type.equals("XML")){

return new XMLParser();

} else{

Parseable p = new HTMLParser();

return p;

//return new HTMLParser();

}

}

}


class XMLParser implements Parseable{

public void parse(String fileName){

//구문 분석 작업을 수행하는코드를 적는다.

System.out.println(fileName+"- XML parsing completed.");

}

}


class HTMLParser implements Parseable{

public void parse(String fileName){

//구문 분석 작업을 수행하는 코드를 적는다.

System.out.println(fileName+"-HTML parsing completed.");

}

}

public class ParserTest {


public static void main(String[] args) {

Parseable parser = ParserManager.getParser("XML");

parser.parse("document.xml");

parser = ParserManager.getParser("HTML");

parser.parse("document2.html");

}


}


: Parseable인터페이스는 구문분석(parsing)을 수행하는 기능을 구현할 목적으로 추상메서드 'parse(String fileName)'을 정의

: XMLParser클래스와 HTMLParser클래스는 Parseable인터페이스를 구현

: 매개변수로 넘겨받은 타입값에 따라 XMLParser인스턴스 또는 HTMLParse인스턴스를 반환


- 인터페이스의 장점

: 개발시간 단축

: 표준화 가능

: 서로 관계없는 클래스들에게 관계를 맺어줄 수 있음

: 독립적인 프로그래밍 가능


- 인터페이스의 이해

: 클래스를 사용하는 쪽(User)과 클래스를 제공하는 쪽(Provider)이 있다.

: 메서드를 사용(호출)하는 쪽(User)에서 사용하려는 메서드(Provider)의 선언부만 알면된다.(내용은 몰라도 됨)


- 디폴트 메서드와 static메서드
: 디폴트 메서드
- 추상메서드의 기본적인 구현을 제공하는 메서드
- 추상메서드가 아니기 때문에 디폴트메서드가 추가되어도 해당 인터페이스를 구현한 클래스를 변경하지 않아도 됨
- 여러 인터페이스의 디폴트 메서드간 충돌
: 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩
- 디폴트 메서드와 조상 클래스의 메서드 간 충돌
: 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시

8. 내부클래스 (inner class)


- AWT나 Swing같은 GUI어플리케이션의 이벤트처리 외에는 잘 사용하지 않음


- 클래스 내에 선언된 클래스

: 두 클래스가 긴밀한 관계이기 때문에 내부에 선언


- 내부클래스 장점

: 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있음

: 코드의 복잡성을 줄일 수 있음 (캡슐화)


- 내부클래스의 종류와 특징

: 변수의 선언위치에 따른 종류와 같음

: 인스턴스 클래스

- 외부 클래스의 멤버변수 선언위치에 선언

- 외부 클래스의 인스턴스멤버처럼 다루어짐

- 외부클래스의 인스턴스멤버들과 관련된 작업에 사용될 목적으로 선언

: static 클래스

- 외부 클래스의 멤버변수 선언위치에 선언

- 외부 클래스의 static멤버처럼 다루어짐

- 외부 클래스의 static멤버, 특히 static메서드에서 사용될 목적으로 선언

: 지역 클래스

- 외부 클래스의 메서드나 초기화블럭 안에 선언

- 선언된 영역 내부에서만 사용될 수 있음

: 익명 클래스

- 클래스 선언과 객체의 생성을 동시에 하는 이름없는 클래스 (일회용)


- 내부 클래스의 선언

: 변수의 선언위치와 동일한 위치에 선언

: 각 선언위치에 따라 같은위치의 변수와 동일한 유효범위, 접근성을 가짐


- 내부 클래스 제어자와 접근성

: 변수와 동일

: 내부 클래스 중 static클래스만 static멤버를 가질 수 있음


- 익명 클래스 

: 이름이 없음

: 클래스의 선언과 객체 생성을 동시에 하기 때문에 단 한번만 사용될 수 있고, 오직 하나의 객체만 생성할 수 있는 일회용 클래스

: 이름이 없으므로 생성자도 가질 수 없음

: 조상클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의하기 때문에 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없음

: 이름이 없기 때문에 '외부 클래스명 $숫자.class'의 형식으로 클래스파일명이 결정됨

반응형

'프로그래밍 > JAVA' 카테고리의 다른 글

[JAVA] 7 객체지향 프로그래밍 2-2  (0) 2017.07.21
[JAVA] 7 객체지향 프로그래밍 2-1  (0) 2017.07.11
[JAVA] 6 객체지향 프로그래밍1  (0) 2017.07.05
[JAVA] 배열 예제  (0) 2017.07.04
[JAVA] 5 배열 (Array)  (0) 2017.07.03
반응형

           

  JAVA Study






3. package와 import


- 패키지란 클래스의 묶음이다

: 클래스 또는 인터페이스를 포함시킬 수 있음

: 서로 관련된 클래스들끼리 그룹 단위로 묶어놓음으로써 클래스를 효율적으로 관리할 수 있음

: 패키지는 물리적으로 하나의 디렉토리

: 하나의 소스파일에 첫 번째 문장으로 단 한 번의 패키지 선언을 허용

: 모든 클래스는 반드시 하나의 패키지에 속함

: 패키지는 점(.)을 구분자로하여 계층구조로 구성가능

: 클래스 파일(.class)을 포함하는 하나의 디렉토리


- 패키지 선언

package 패키지명;

: 패키지명은 대소문자를 모두 허용하지만 클래스명과 구분하기 위해 소문자를 사용

: 모든 클래스는 반드시 하나의 패키지에 포함되어야 함, 패키지를 선언하지 않을 경우 기본으로 제공되는 'unnamed package'에 속함


- import 문

: 사용하고자 하는 클래스의 패키지를 미리 명시해줌

: 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공


- import문 선언

:한 소스파일에 여러 번 선언 가능

import 패키지명.클래스명;

import 패키지명.*; // '*'은 패키지에 속하는 모든 클래스를 의미함


- static import문

: static 멤버를 호출할 때 클래스 이름을 생략할 수 있음

: 특정 클래스의 static멤버를 자주 사용할 때 편리

import static java.lang.Integer.*;  // Integer 클래스의 모든 static메서드


4. 제어자 (modifier)


- 제어자는 클래스, 변수, 메서드 선언부에 함께 사용되어 부가적 의미를 부여


- 접근 제어자와 그 외의 제어자로 구분

: 접근 제어자 - public / protected / default / private

: 그 외 제어자 - static / final / abstract / native / transient / synchronized / volatile / strictfp


- 하나의 대상에 대해 여러 제어자를 조합하여 사용 가능


- 접근 제어자는 한 번에 하나만 선택해서 사용가능


- static ( 클래스의, 공통적인 )
: 클래스변수는 인스턴스에 관계없이 같은 값을 가짐
: 하나의 변수를 모든 인스턴스가 공유
: static이 붙은 멤버변수와 메서드, 초기화 블럭은 인스턴스가 아닌 클래스에 관계된 것이므로 인스턴스를 생성하지 않고 사용 가능
: 인스턴스 메서드와 static 메서드의 근본적인 차이는 메서드 내에서 인스턴스 멤버를 사용하는가의 여부에 있음
: 멤버변수 / 메서드 / 초기화 블럭에서 사용 가능

- final ( 마지막의, 변경될 수 없는 )
: 거의 모든 대상에 사용될 수 있음 ( 클래스 / 메서드 / 멤버변수 / 지역변수 )
: 변수에 사용되면 값을 변경할 수 없는 상수가 됨
: 메서드에 사용되면 오버라이딩을 할 수 없게 됨
: 클래스에 사용되면 자신을 확장하는 자손 클래스를 정의할 수 없음
: 생성자를 이용한 final 멤버 변수의 초기화
- final이 붙은 변수는 상수이므로 일반적으로 선언과 초기화를 동시에 함
- 인스턴스변수의 경우 생성자에서 초기화 되도록 할 수 있음
: 클래스 내에 매개변수를 갖는 생성자를 선언하여, 인스턴스를 생성할 때 final이 붙은 멤버변수를 초기화하는데 필요한 값을 생성자의 매개변수로부터 제공받는 것

- abstract ( 추상의, 미완성의 )
: 메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않음
: 클래스 / 메서드에서 사용 가능
: 클래스 - 클래스 내에 추상 메서드가 선언되어 있음을 의미
: 메서드 - 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알림
: 추상 클래스는 아직 완성되지 않은 메서드가 존재하기 때문에 인스턴스를 생성할 수 없음
: 추상 클래스만으로는 쓸모가 없지만 다른 클래스가 이 클래스를 상속받아서 오버라이딩해 사용함

- 접근 제어자 ( access modifier )
: 멤버, 클래스에 사용되어 해당 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 함
: 클래스 / 멤버변수 / 메서드 / 생성자에서 사용됨
: private - 같은 클래스 내에서만 접근 가능
: default - 같은 패키지 내에서만 접근 가능
: protected - 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능
: public - 접근 제한 없음
: public > protected > default > private

- 접근 제어자를 이용한 캡슐화
: 접근제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위해서이다.
- 외부로부터 데이터 보호
- 외부에 불필요한, 내부적으로만 사용되는 부분을 감추기 위해
: 데이터 감추기 (data hiding) - 데이터가 유효한 값을 유지하도록 또는 비밀번호와 같은 데이터를 외부에서 함부로 변경하지 못하도록 하기 위해 외부로부터의 접근을 제한하는 것 => 객체지향의 캡슐화
: 클래스 내에서만 사용되는, 내부 작업을 위해 임시로 사용되는 멤버변수나 부분작업을 처리하기 위한 메서드 등의 멤버들을 클래스 내부에 감추기 위해

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Time {
    private int hour;    // 접근 제어자를 private으로 하여 외부에서 직접 접근 불가
    private int minute;
    private int second;
 
    public int getHour() {
        return hour;
    }
    public void setHour (int Hour) {
        if (Hour <0 ||  Hour > 23return;
        this.hour = hour;
    }
 
    public int getMinute() {
        return Minute;
    }
    public void setMinute (int minute) {
        if (minute<0 ||  minute> 23return;
        this.minute= minute;
    }
 
    public int getSecond() {
        return second;
    }
    public void setHour (int second) {
        if (second<0 ||  second> 23return;
        this.second= second;
    }
}
cs


- getter 
: get으로 시작하는 메서드는 멤버변수의 값을 반환하는 일
: 멤버변수의 값을 읽는 메서드의 이름을 'get멤버변수 이름'으로 작성

- setter
: set으로 시작하는 메서드는 매개변수에 지정된 값을 검사하여 조건에 맞으면 멤버변수 값을 변경
: 멤버변수의 값을 변경하는 메서드의 이름을 'set멤버변수 이름'으로 작성

- 생성자의 접근 제어자
: 생성자에 접근 제어자를 사용함으로 인스턴스 생성을 제한할 수 있음
: 보통 생성자의 접근제어자는 클래스의 접근제어자와 같지만 다르게 사용할 수 있음
: 생성자가 private인 클래스는 다른 클래스의 조상이 될 수 없다
- 자손클래스의 인스턴스 생성 시 조상클래스의 생성자를 호출해야하는데 private이므로 호출이 불가하기 때문
: 따라서 생성자가 private인 클래스 앞에 final을 붙여 상속할 수 없는 클래스임을 알리는 것이 좋다

- 제어자 조합
: 메서드에 static과 abstract를 함께 사용할 수 없음
- static 메서드는 몸통이 있는 메서드에만 사용할 수 있음
: 클래스에 abstract와 final을 동시에 사용할 수 없음
- 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미, abstract는 상속을 통해서 완성되어야 한다는 의미이기 때문
: abstract메서드의 접근제어자가 private일 수 없음
- abstract메서드는 자손클래스에서 구현해 주어야 하는데 접근제어자가 private이면, 자손클래스에서 접근할 수 없기 때문
: 메서드에 private과 final을 같이 사용할 필요 없음
- 접근 제어자가 private인 메서드는 오버라이딩 될 수 없기 때문, 둘 중 하나만 사용해도 의미 충분히 전달됨

5. 다형성 (polymorphism)


- 상속과 깊은 관계가 있음

- 여러가지 형태를 가질 수 있는 능력을 의미

- 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 구현

: 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하는 것


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Car{
    String color;    
    int door;    
 
    void drive() {    // 운전하는 기능
        System.out.println("drive, Brrr");
    }
    void stop() {    // 멈추는 기능
        System.out.println("stop!!");
    }
 
}
 
class FireEngine extends Car{    //소방차
    void drive() {    // 소방차운전
        System.out.println("drive,fire!!");
    }
}
 
 
class Ambulance extends Car{
    void siren() {    // 사이렌 울리는 기능
        System.out.println("siren!!");
    }
}
 
cs




: 인스턴스 타입과 참조변수 타입이 일치하는 것이 보통이지만 클래스가 서로 상속관계에 있을 경우 조상클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조하도록 하는 것도 가능하다


FireEngine e = new FireEngine();

car c = new FireEngine();       // 조상 타입의 참조변수로 자손 인스턴스를 참조

=> 자손의 인스턴스를 참조하므로 c.drive()의 결과는 drive, fire이 된다.

=> 둘 다 같은 타입의 인스턴스지만 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라짐





반응형

'프로그래밍 > JAVA' 카테고리의 다른 글

[JAVA] 7 객체지향 프로그래밍 2-3  (0) 2017.07.22
[JAVA] 7 객체지향 프로그래밍 2-1  (0) 2017.07.11
[JAVA] 6 객체지향 프로그래밍1  (0) 2017.07.05
[JAVA] 배열 예제  (0) 2017.07.04
[JAVA] 5 배열 (Array)  (0) 2017.07.03
반응형

세상에 나쁜개는 없다

강아지 공장에서 구조된 번식견 햇살이









반응형
반응형

세상에 나쁜개는 없다

외부인 공격견 레오







반응형

+ Recent posts