2020. 3. 16. 21:27ㆍStudy/Computer Science
1. 람다식
람다식이란?
- 익명 함수를 이용해서 익명 개체를 생성하기 위한 식
- 객체 지향 언어보다 함수 지향 언어에 가까움
- 람다 형태 : 매개변수를 가진 코드 블럭이지만, 런타임 시에는 익명 구현 개체(추상메소드 한개 포함) 생성
요약 : 한 개의 추상메소드를 갖는 인터페이스(함수적 인터페이스, @FunctionalInterface)가 있을 때, 이 추상메소드를 구현해서 사용하기 위한 방법 중 하나. 다른 방법으로는 그 인터페이스를 받는 객체를 생성해서 사용하거나 (이 방식은 이후 클래스를 통하여 코드 재사용 가능), 재사용 필요없을 시 Main에서 인터페이스 인스턴스 생성하면서 Override를 통해 구현하는 방법이 있다. [https://juyoung-1008.tistory.com/48]
@FunctionalInterface가 적용된 함수적 인터페이스의 경우 추상메서드를 하나만 선언할 수 있으며, 1개가 아닐 시 에러가 발생한다.
람다식은 함수적 인터페이스 인스턴스를 생성함과 동시에 그 인터페이스의 추상메서드를 구현 하는 것.
// 추상메소드가 한개인 인터페이스 (= 함수적 인터페이스)
@FunctionalInterface
public Interface TestInterface{
public int sum(int a, int b);
}
public class Main{
public static void main(String[] args){
TestInterface t = (a,b) ->{return a + b;}; //람다식 표기법
System.out.println(t.sum(3,4));
}
}
람다식은 중복되지 않을 코드 블럭을 빠르게 구현하는 데 의의가 있다고 생각한다. 따라서 람다식은 위 코드를 더욱 줄일 수 있는 몇가지 문법이 있다.
람다식의 문법
@FunctionalInterface
public interface TestInterface1{
public int sum(int a, int b);
}
@FunctionalInterface
public interface TestInterface2{
public void show(int a);
}
1. 람다식의 매개인자의 자료형은 생략 가능하다.
TestInterface f1 = (a,b) -> {return a+b;};
2. 람다식의 매개인자가 한개인 경우 매개인자를 감싸는 소괄호를 생략할 수 있다.
TestInterface2 f2 = a -> {System.out.println("a:" + a); };
3. 람다식의 함수몸체에 실행문이 한개인 경우 함수의 몸체를 감싸는 중괄호를 생략할 수 있다.
TestInterface s1 = (a,b) -> return a+b;
TestInterface2 s2 = a -> System.out.println("a:" + a);
4. 람다식의 함수몸체에 실행문이 한개이고, 그 실행문이 return문일 경우 함수 몸체를 감싸는 중괄호와 return을 생략할 수 있다.
TestInterface t1 = (a,b) -> a+b;
2. 문자열 클래스
String 객체와 String 리터럴
아래와 같은 두개의 String이 선언되었다.
String str1 = new String("Hi");
String str2 = "Hi";
여기서 str1은 new를 통하여 인스턴스를 생성했으므로 String 객체이고, str2는 String 리터럴이다.
Java에서 String 객체는 heap 영역 안에, String 리터럴은 heap 영역 안의 String constant Pool이라는 영역 안에 저장된다. 따라서 두 개가 저장되는 공간의 주소가 다르기 때문에
public class Main{
public static void main(String[] args){
String str1 = new String("Hi");
String str2 = "Hi";
System.out.println(str1.equals(str2)); //출력 : true
System.out.println(str1 == str2); // 출력: false
}
}
위와같은 코드에서 equals로 단순히 str1, str2의 문자열 자체만 비교했을때는 true가 나오지만, 주소가 동일한지 보는 == 의 경우에는 false가 출력되는 것이다.
StringBuffer과 StringBuilder
String 객체의 경우에는 문자열이 변경되면 기존의 객체를 버리고(GC에 의한 메모리 회수가 이루어지고), 새로운 객체를 메모리에 생성한다. 따라서 String 클래스는 데이터가 변하면 메모리상의 변화가 많아 속도가 느리다.
String str = "Java";
str = str + "_8"; //기존 객체 버리고 새로운 객체 메모리에 생성
이때 필요한 것이 StirngBuffer과 StringBuilder 클래스이다. 이들은 String 클래스의 단점을 보완한 클래스로 데이터가 변경되면 메모리에서 기존객체를 재활용한다.
StringBuffer sf = new StringBuffer("JAVA");
sf.append("_8"); // 기존 객체 그대로 활용
3. Collections
List
리스트는 배열과 비슷한 자바의 자료형으로서 자료를 동적으로 저장할때 이용되는 인터페이스 클리스이며. 또한 배열보다 편리한 기능들을 가지고 있다. 또한 List를 사용해서 자료구조에서 배운 연결리스트나 이중연결리스트를 구현할 수 있는데, 일단 가장 간단한 ArrayList의 기능들에 대해 알아보자.
import java.util.ArrayList;
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<String> food = new ArrayList<String>(); //ArrayList 인스턴스 생성
//객체 추가
food.add("Pizza");
food.add("Chicken");
food.add("Hamburger");
//원하는 인덱스에 객체추가
food.add(0,"Pasta"); //첫번째 인덱스에 파스타 추가
//원하는 인덱스의 값 가져오기
System.out.println(food.get(1)); // 출력: Pizza
//list 안의 전체 갯수 리턴
System.out.println(food.size());
//list안에 해당 항목값이 있는지 리턴(boolean)
System.out.println(food.contains("Cake"));
//항목값 삭제하기
System.out.println(food.remove("Cake")); //항목값으로 삭제하기
System.out.println(food.remove(0)); // 인덱스번호로 삭제하기
//데이터 전체 제거
food.clear;
//데이터 유무
boolean b = food.isEmpty(); //b = true 저장
}
}
Map
Map도 List와 마찬가지로 인터페이스 클래스이다. 이는 key를 통해서 value를 도출한다는 특징이 있다.
import java.util.HashMap;
public class MapTest{
public static void main(String[] args){
HashMap<String,String> map = new HashMap<String,String>();
//(key, value) 순서이다.
// 데이터 추가
map.put("한국어", "Bonjour");
map.put("English", "Hello");
// 데이터 교체
map.put("한국어", "안녕");
//key를 통해 value 찾기
System.out.println(map.get("한국어")); //출력 : 안녕
//맵에 해당 key, value있는지 조사하고 결과값 리턴(boolean)
System.out.println(map.containsKey("English")); // 출력: true
System.out.println(map.containsValue("안녕")); // 출력: true
//key를 통해 해당 (key,value) 삭제하고 value값 리턴
System.out.println(map.remove("English")); // 출력 : Hello
//Map의 갯수 리턴, 아까 English 지워졌으니 1 출력
System.out.println(map.size());
//데이터 전체제거
map.clear();
//데이터 유무
boolean b = map.isEmpty() // b = true 저장 (바로 위에서 clear 됐으므로)
}
}
'Study > Computer Science' 카테고리의 다른 글
Java 프로그래밍 기초 9 - 인터페이스와 추상 클래스 (0) | 2020.03.13 |
---|---|
Data Structure - Tree (2) (0) | 2020.03.12 |
Java 프로그래밍 기초 8 (0) | 2020.03.12 |
Data Structure - Trees (1) (1) | 2020.03.11 |
Java 프로그래밍 기초 7 (0) | 2020.03.11 |