익명 객체를 생성하는 람다식 자바는 객체 지향 언어로 객체 없이 메서드를 호출할 수 없다. 람다식은 객체 없이 인터페이스의 구현만으로 메서드를 호출할 수 있는데, 그 이유는 익명 내부 클래스에 있다. 익명 내부 클래스는 클래스 이름 없이 인터페이스 자료형 변수에 바로 메서드 구현부를 생성하여 대입할 수 있음 즉, 람다식으로 메서드를 구현해서 호출하면 컴퓨터 내부에서는 익명클래스가 생성되고, 이를 통해 익명 객체가 생성되는 것 StringConcat concat3 = new StringConcat() { @Override public void makeString(String s1, String s2) { System.out.println(s1 + "," + s2); } }; // => 내부적으로 익명 구현..
JAVA
자바 8에 추가된 가장 큰 특징 "함수형" 프로그래밍 형태를 받아들인 결과 함수형 프로그램이란? (함수형 vs 객체지향) 함수형 : 1950년대, 객체지향 : 1990년대 (역사가 더 오래되었음) 기능 위주의 프로그래밍 기법 매개변수만을 사용하여 만드는 함수(순수 함수, pure function)를 구현하고 호출함으로써 외부 자료에 부수적인 영향을 주지 않도록 구현하는 방식 객체 지향 : 객체를 기반으로 구현, 클래스에 속성과 기능을 정의 함수형 : 함수를 기반으로 자료를 입력받아 구현, ,기능 즉 함수가 따로 존재 함수 이름이 없는 익명함수를 만드는 것 메서드의 이름과 리턴타입을 빼고 '->'를 활용하여 람다식을 구현 ex) public int add(int x, int y) { return x + y..
익명객체의 로컬 변수 사용 메서드의 매개변수나 로컬변수를 익명 객체 내부에서 사용할 때 제한이 있음 익명객체는 메서드 실행이 종료되면 없어지는 것이 일반적이지만, 메서드가 종료되어도 계속 실행 상태에 존재할 수 있음 (ex. 익명 쓰레드 객체 사용) 메서드의 매개변수나 로컬변수를 익명 객체 내부에서 사용할 때 매개변수나 로컬변수는 메서드 실행이 끝나면 스택(stack) 메모리에서 사라지기 때문에 익명객체에서는 지속적으로 사용할 수 없음 이런 문제를 해결하기위해 자바는 컴파일 시 익명 객체에서 사용하는 매개변수나 로컬변수의 값을 익명 객체 내부에 복사해두고 사용함 매개변수나 로컬변수가 수정되어 값이 변경되면 수정된 값과 익명 객체에 복사해둔 값이 달라지게 되어 매개변수나 로컬변수를 final로 선언할 것을..
버튼의 클릭 이벤트 처리 Button 클래스 정의 class Button { static interface OnClickListener { //중첩 인터페이스 선언 void onClick(); } OnClickListener listener; //인터페이스 타입 인스턴스 변수(필드) 선언 public void setOnClickListener(OnClickListener listener) { // 매개변수의 다형성 this.listener = listener; } // => 외부에서 구현객체를 받아 필드에 대입 public void touch() { listener.onClick(); // 구현 객체의 onClick() 메서드 호출 } } Button 2개를 가지고 있는 Window 클래스를 정의(가정)..
인터페이스 타입의 필드 또는 변수를 선언하고, 구현 객체를 초기값으로 대입 interface RemoteControl { public abstract void turnOn(); void turnOff(); //abstract 생략됨 } class TV implements RemoteControl { @Override public void turnOn() { System.out.println("TV켜기"); } @Override public void turnOff() { System.out.println("TV끄기"); } } class UseImplentesClass { RemoteControl rc = new TV(); // 멤버변수에 구현 객체를 대입 public void method() { Remo..
익명객체의 개념과 특징 클래스 이름이 없는 객체 클래스 선언과 객체의 생성을 동시에 하기 때문에 단 한번 사용될 수 있고 오직 하나의 객체만을 생성할 수 있는 일회성 클래스 이름이 없기때문에 생성자도 가질 수 없다. 익명 객체를 만들기 위해서는 어떤 클래스를 상속하거나 인터페이스를 구현 부모클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의하므로 한번에 하나의 클래스로 상속받는 동시에 인터페이스를 구현함 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있음 익명객체 문법 new 슈퍼클래스이름() { // 멤버 선언 }; 또는 new 구현인터페이스이름() { // 멤버 선언 }; 익명객체를 사용하지 않는 일반적인 상속 관계 class NormalParent { public..
2023.10.31 - [JAVA] - [JAVA] 제네릭(Generic, 일반화) - 1 [JAVA] 제네릭(Generic, 일반화) - 1 클래스 정의 시 사용되어질 데이터타입을 미리 명시하지 않고 객체 사용 전 사용할 타입을 객체 생성 시 명시하여 사용하는 기법 주로, Collection API의 클래스들이 제네릭이 적용되어 있으므로 인 cutyqueen.tistory.com Object 타입을 사용하여 관리하는 데이터는 Object 타입으로 저장 가능 Object o = nc.getData(); ➡️만약, Onject 타입을 실제 데이터타입으로 변환하는 경우 잘못된 타입 변환(다운캐스팅)으로인해 ClassCastException 발생 가능 ➡️ 다운캐스팅 필요 String name = (Strin..
클래스 정의 시 사용되어질 데이터타입을 미리 명시하지 않고 객체 사용 전 사용할 타입을 객체 생성 시 명시하여 사용하는 기법 주로, Collection API의 클래스들이 제네릭이 적용되어 있으므로 인스턴스 생성 시 제네릭 타입으로 사용할 데이터타입을 지정 지정된 데이터타입이 클래스 내의 임시 데이터타입을 대체하게 됨 제네릭을 적용하지 않는 일반 클래스 정의 사용할 데이터타입을 특정 타입으로 관리하는 일반 클래스 class NormalIntegerClass { int data; public int getData() { return data; } public void setData(int data) { this.data = data; } } NormalIntegerClass nic = new NormalI..