람다식 , 최상위클래스 Object
2023.06.07 - [JAVA기초] - 추상클래스, 추상메서드, 익명클래스 ,인터페이스,함수형인터페이스
추상클래스, 추상메서드, 익명클래스 ,인터페이스,함수형인터페이스
2023.06.02 - [JAVA기초] - 스태틱 (static) 정적변수, 정적메서드 ,final 스태틱 (static) 정적변수, 정적메서드 ,final static (값이 변하지 않는) 객체를 생성하지 않아도 접근할 수 있는 요소에 static을 붙힌다
ji7290.tistory.com
이전 글에서는 추상클래스와 메서드 ,익명클래스, 인터페이스에 대해 다뤄보았다
이번 글에서는 람다식을 다뤄보고 인터페이스와 추상클래스를 같이 활용해보자.
람다식의 기본형식 : ( ) -> { }
( ) : 함수의 매개변수를 작성하는 공간
-> : 람다식 기호
{ } : 햠수의 실행 내용 (body), 실행코드가 한줄이면 {} 를 생략한다.
: 한줄의 실행코드가 return이면 return도 생략한다.
Runnable 객체가 추상 클래스고 함수가 하나뿐이기 때문에
함수를 굳이 쓰지 않고 람다식으로 출력시킬 수 있다.
comparable 추상클래스로 o와 hello를 비교하는 코드와 람다식 객체를 통해서 간결하게 작성하는코드
매개변수 개수가 1개 (생략가능)
실행코드 1줄 (생략가능)
그리고 실행코드가 한줄일때는 return을 반드시 제거해야한다.
매개변수가 2개일때는 소괄호를 생략할 수 없다.
compare함수의 내부 코드가 한줄이니 생략하고 return을 제거한다.
comparator와 람다식을 활용해서 배열을 선택정렬하는 방식
a와 b의 두개의 정수를 받아서 compareTo로 a와 b를 비교해서 정렬하는 방식
람다식을 이용해서 아주 간결하게 작성할 수 있다.
학생들의 점수를 선택정렬하는 코드
Student 클래스 작성 생성자 오버로딩으로 국,영,수 이름을 매개변수로 받아준다.
show는 이름 , 국,영,수 ,합계, 평균을 출력해주는 메서드
showArray함수는 매개변수 Student배열변수를 반복하면서 show메서드를 출력
main안에서 Student객체로 arr배열을 생성해서 각각 학생의 이름과 국,영, 수 점수를 넣어준다.
추상클래스와 익명내부클래스, 람다식 으로 코드를 작성하는 방식들
1.학생들의 점수를 선택정렬하는 코드를 반복문을 통해 직접 작성
arr의 길이만큼 순회하면서 객체a의 합계 점수 - b의 합계 점수가 0보다 크면 tmp를 통해서 값을 바꿔준다.
이코드는 합계 점수를 기준으로 선택정렬하는 코드다.
만약 국,영,수,이름,합계,평균 모두 선택정렬하는 코드를 작성하고싶다면 그에 맞는 함수를 일일이 만들어줘야한다.
이는 메모리 소모도 크고 코드의 유지보수 및 가독성이 떨어진다.
2. 추상 클래스와 익명클래스로 국어점수를 내림차순 정렬하는 코드 작성하기
comparator 비교하는 인터페이스 추상 객체를 생성하고 오버라이딩을 통해서
Student a와 b를 매개변수로 받아주고 b와 a의 국어점수를 반환
3. 람다식을 이용해서 객체를 생성하고 영어 점수 기준으로 내림차순 정렬하기
객체를 생성하면서 람다식을 통해 종속문장에 리턴값으로 a와 b의 영어 점수를 반환시켜준다.
4. 람다식으로 즉석에서 객체를 생성하면서 전달하고, 수학 점수 기준 내림차순 정렬하기
내장함수 sort의 전달요소를 arr과 람다식을 바로 할당시켜서 출력시켜주기
앞서 작성한 1~4번의 코드는 전부 같은 기능을 실행하는 코드이지만
추상클래스와 메서드, 람다식을 통해서 코드를 간결하게 작성해줄 수 있다.
Object : 자바의 모든클래스의 최상위 슈퍼클래스
클래스에 아무 내용도 넣지않았지만
자바의 최상위클래스 object가 가지고있는 내장함수들을 객체에 할당해서 출력시킬 수 있다.
extends를 지정하지않으면 자동으로 Object클래스의 상속을 받기로 되어있다.
equals, toString 내장 함수를 오버라이딩하기
main에서 객체를 생성해서 출력시켜도 toString은 이미 Object가 가지고 있는 내장함수라서 실행이 된다.
형태에 상관없이 어떤 객체를 저장하기 위해서 Object클래스를 사용하기도 한다
장점 : 자료형에 상관없이 어떤 객체든 저장할 수 있다
단점 : 다른 곳에서 꺼내서 사용하려면 "다운 캐스팅"을 해야 정상적으로 사용할 수 있다.
object클래스가 sc를 참조하고 있긴하지만,
object클래스로는 scanner의 모든범위를 참조할 수 없기 때문에 에러가 뜬다.
전체 클래스
main에서 전체코드
출력결과