본문 바로가기

IT_Term

[IT_Term] Java_this, 상속, Generic_방통대 교재 정리

728x90

###. super, this

 

#. this

 - 인스턴스 메소드가 호출될 때 사용된 현재 객체를 가리킴

#. super

 - 자료형이 직계 상위의 슈퍼 클래스인 변수가 됨

#. [this.필드 이름], [super.필드이름]

 - this는 현재 클래스에 정의된 필드를 참조할때 사용

 - super는 현재 클래스의 슈퍼 클래스에 정의된 필드를 직접 참조할 때 사용

#. [this.메소드 이름()], [super.메소드 이름()]

 - this는 현재 클래스에 정의된 메소드를 호출할 때 사용

 - super는 현재 클래스의 슈퍼 클래스에 정의된 메소드를 호출할 때 사용

 

###. 상속 클래스

 

#. 추상클래스 (abstract)

 - 서로 관련이 있는 클래스들이 메소드 형식을 공유해야 할 때, 공유가 필요한 메소드 형식을 추상 클래스에 두고, 클래스들은 추상 클래스의 서브 클래스가 되어 메소드 몸체를 정의하도록 한다.

 - 이때 추상 클래스로부터 상속 관계로 만들어진 클래스들은 슈퍼 클래스가 같은 자식이 된다. 또한 추상 클래스에는 일반 필드를 정의할 수 있기 때문에 서브 클래스들이 필드를 상속받을 수 있다.

 - 추상클래스의 서브 클래스들은 "extends"를 사용

 - 추상클래스를 상속받는 서브 클래스에서는 반드시 부모 메서드를 구현해야 한다.

 - 생략 가능

 

 #. 인터페이스 (Interface)

 - 일반적으로 서로 연관이 없는 클래스들이 비슷한 기능을 공유해야 할 경우 사용

 - 여러 개의 인터페이스를 구현하는 하나의 클래스를 정의하는 것이 가능하므로 클래스에서 구현되어야 할 기능을 종류별로 각각 서로 다른 인터페이스로 정의해 놓고 그것을 구현하는 클래스로 정의하여 사용

 - 인터페이스의 서브 클래스들은 "implements"를 사용

 - 인터페이스를 구현하는 클래스를 정의할 때 두개 이상의 인터페이스를 상속 받아 구현하는 것이 가능

 - 추상클래스를 상속받는 서브 클래스에서는 반드시 부모 메서드를 구현해야 한다.

 - 인터페이스를 구현해야는 클래스가 하나밖에 없는 경우에는 굳이 인터페이스를 정의하여 사용할 필요가 없다.

 

#. 공통기능을 한데 묶어 Conputer로 정의(abstract)하고, 컴퓨터의 기능이기는 하지만 개별 컴퓨터에 따라 구체적인 동작이 달라질 수 있느 기능을 Calculater 인터페이스(interface)로 정의

#. 회사에서 직원마다 다양한 업무를 담당한다고 할때, 영업부 직원은 물건을 팔고 개발부 직원은 제품을 개발하고 총무부 직원은 회사 살림을 챙긴다. 하지만 이 모든 직원의 일은 '회사 업무'라는 말로 추상화 시킬수 있다. 만일 사장이 모든 직원에게 '회사 업무를 해라'라고 지시한다면 영업은 영업, 개발은 개발을 할 것이다. 사장의 관점에서는 모두 회사 업무를 하지만 직원 입장에서는 자신에게 주어진 구체적인 업무를 한다.

 

###. 열거 자료형

 

#. enum

 - 클래스처럼 생성자와 메소드 및 필드를 정의할 수 있다.

 - 첫글자 대문자

 - 열거형으로 선언된 변수가 가질 수 있는 값을 의미하는 상수값도 대문자로 표현하는 것이 관례

 - <열거형 이름>.<상수값>의 형식을 사용

 - values() 메서드를 제공, 열거형에 지정된 상수값들을 차례로 참조 (C의 포인터와 비슷한 개념인듯)

 

 

###. 익명 클래스

 

#. anonymous class

 - 일반적 클래스와는 다르게 독립된 클래스 정의문 없이 바로 객체를 생성하는 용도로만 사용되는 클래스

 

#. 생성방법 2가지

 - 클래스를 상속받는 서브 클ㄹ스로 익명 클래스를 만들어 객체를 생성하는 방법

 - 인터페이스를 구현하는 클래스로 익명 클래스를 만들어서 객체를 생성하는 경우

 

 

###. 제네릭 <generics>

#. 제네릭 정의<>

 - 소스 코드를 모듈화 시켜 프로그램의 재사용성을 높이고 소스 코드를 컴파일 할 때 자료형 감사를 보다 업격하게 수행하여 실시간 오류를 최소화 하기 위한 기법

 - 크기가 크고 복잡한 프로그램을 작성할 때에는 오류를 최소화 하는 새로운 기법이 필요

 - java의 클래스, 인터페이스, 메서드를 정의할 떄 자료형을 매개변수화 할수 있다.

 - 메서드 호출 시 매개변수의 타입과 일치하는 값을 대입하는 것처럼 제네릭의 타입 매개변수(타입 파라미터)에 사용할 타입을 지정

 

#. 제네릭의 장점

 - 컴파일 시 엄격한 자료형 검사

 : 제네릭을 사용한 코드는 컴파일할 때 엄격한 자료형 검사가 가능

 : 찾아내기 힘든 실행 오류를 줄일 수 있다.
 - 캐스트 연산자 불필요

 : 제네릭을 사용하지 않은 캐스트(형변환) 연산자로 명시적 형변환을 해야한다.

 : 사용하지 않은 경우

 

List list = new ArrayList();

list.add("java");

String s = (String)list.get(0);

 

- List 인터페이스형 변수를 선언하고 ArrayList 클래스의 객체를 생성하여 대입하고 있다. Arraylist 클래스는 List 인터페이스를 구현하는 클래스이다. List 인터페이스에서 get()메서드의 반환형은 Object 유형이기 때문에 String형 변수에 대입하기 전에 캐스트 연산자를 사용한 형변환이 필요하다.

 - List 인터페이스와 ArrayList 클래스를 모두 제네릭을 지원하는 인터페이스아ㅗ 클래스로 자료형 매개변수를 지정하는 것이 가능

 

List <String> list = new ArrayList <String>();

list.add("java");

String s = list.get(0);

 

 - 컴파일러는 소스코드를 종합적으로 분석하는 것이 아니라 소스 코드의 각 라인이 문법적으로 올바른지만 확인 한다.

 

#. 제네릭 타입

 - 클래스나 인터페이스에서 사용되는 자료형을 매개변수처럼 만들어서 정의한 클래스나 인터페이스를 각각 '제네릭 클래스', '제네릭 인터페이스'라고 하고 통칭하여 '제네릭 타입'이라고 한다.

 - 제네릭 클래스 정의

<접근 제어자> class <클래스 이름> <T1,T2,...> {    

<필드>

<메서드>

}

 - 위와 같이 제네릭 타입을 사용하게 되면 제네릭 클래스인 Data 클래스에서 set(), get() 메서드는 동일한 자료형을 각각 매개변수와 리턴값으로 사용하는데 data 객체를 생성할 때 그 자료형을 String으로 정했기 때문에 data.set(i); 구문에서 매개변수 i가 Integer형 객체가 아니라 String 객체가 되어야 하기 때문에 자료형 불일치로 컴파일 오류가 난다.

 

 - class Pair<K, V>{

private K key;

private V value;

}

 - public class GenericsTest{

public static void main (Strfing args[]){

Pair <Integer, String> p1 = new Pair<>(1,"apple");

}

}

 - 제네릭 타입을 제한할 수 있는데 class Data<T extends Number>{};라는 형식으로 가능하다

 - 클래스형이 아닌 기본 자료형은 타입 매개변수에 대입할 수 없다.

 : <int>

 - 매개변수 타입으로 객체를 생성할 수 없다.

 : private T data = new T();

 - 매개변수 타입으로 static 필드를 정의할 수 없다.

 : private static T t;

 - 제네ㅌ릭 타입으로 정의된 클래스로 배열을 선언할 수 없다.

 : Data <Integer>[ ] arrayofData = new Data <Integer>[2];

 

#. Integer 타입이란?? chatGPT

 -  int는 기본 자료형으로서 값만 저장하고 연산하는 데에 사용되는 키워드입니다. Integer는 int를 래핑한 클래스로, 객체로서의 특징과 메서드들을 사용할 수 있습니다. int는 null 값을 가질 수 없고, 메서드 호출이 불가능하지만 더 효율적이고 메모리 사용 면에서 우수합니다. Integer는 null 값을 가질 수 있고, 다양한 메서드를 사용할 수 있으나 메모리 사용 면에서 int보다 더 많은 공간을 차지합니다.

 

 

###. 람다식 (lambda expression)

 - 매개변수를 갖는 코드 블록으로 익명 클래스의 객체를 생성하는 부분을 수식화 한 것.

 - 코드를 보다 간단하게 작성할 수 있다는 장점

 - JDK 1.8버전에 새롭게 포함된 기능으로 매개변수를 갖는 코드 블록으로 익명 구현 클래스의 객체를 생성하는 부분을 수식(expression)화 한 것

 - Runnable이란 스레드를 생성할 때 사용되는 인터페이스

 - 람다식 형태

 : <인터페이스><객체 변수> =(<매개변수 목록>) -> {<실행문 목록>};

 : Runnable runnable = () -> {};

 

 - 소스코드 참고

 interface LambdaEx {

public void method (int a, int b);

}

public calss LambdaTest{

메인 메서드 (){

LambdaEx l1;

l1 = (a, b) -> {syso (a + b);};

}

}

 

#. 리턴 값이 있는 람다식

 -소스코드

l1 = (a, b) -> {return a + b;};

syso (l1.method(3,4));

 

 

 

 

728x90