반응형 개발/Java38 스트림(Stream) 스트림이란? 스트림은 자바 8 API에 새로 추가된 기능이다. 스트림을 이용하면 선언형(즉, 데이터를 처리하는 임시 구현 코드 대신 질의로 표현)으로 컬렉션 데이터를 처리할 수 있다. 또한 스트림을 이용하면 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다. 얼마나 코드가 간단해지는지 직접 눈으로 확인해보자! 먼저 기존 자바 코드다. List lowCaloricDishes = new ArrayList(); for(Dish dish : menu){ if(dish.getCalories() < 400){ lowCaloricDishes.add(dish); } } Collections.sort(lowCaloricDishes, new Comparator(){ //익명 클래스 전달 publi.. 개발/Java 2022. 3. 11. 메서드 참조 메서드 참조 이제 람다 표현식에 이어 메서드 참조에 대해 알아보자. 메서드 참조를 이용해 기존의 메서드 정의를 재활용해서 람다처럼 전달할 수 있다. 때로는 람다 표현식보다 메서드 참조를 사용하는 것이 더 가독성이 좋으며 자연스러울 수 있다. 다음은 메서드 참조와 새로운 자바8 API를 이용한 정렬 예시다. //기존 코드 inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()))); //다음은 메서드 참조와 java.util.Comparator.comparing을 활용한 코드다. inventory.sort(comparing(Apple::getWeight)); //이제부터 이 문법에 대해 알아보자. 메서드 참조는 특정 메서.. 개발/Java 2022. 3. 9. 람다 표현식이란? 람다란 표현식이란? 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이다. 람다 표현식에는 이름은 없지만, 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외 리스트는 가질 수 있다. 람다의 특징은 아래와 같다. 익명 : 보통의 메서드들과 달리 이름이 없으므로 익명이라 표현한다. 함수 : 람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부른다. 하지만 메서드처럼 파라미터 리스트, 바디, 반환 형식, 가능한 예외 리스트를 포함한다. 전달 : 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다. 간결성 : 익명 클래스처럼 많은 자질구레한 코드를 구현할 필요가 없다. 람다는 파라미터, 화살표, 바디로 이루어진다. (Apple a1, Apple a2) -> a1.get.. 개발/Java 2022. 3. 8. 제네릭 (Generics) 제네릭이란? 제네릭은 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크를 해주는 기능이다. 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형 변환의 번거로움이 줄어든다. 즉 장점은, 타입 안정성을 제공 타입 체크와 형 변환을 생략할 수 있으므로 코드가 간결해짐 제네릭은 클래스와 메서드에 선언할 수 있는데, 먼저 클래스에 선언하는 제네릭 타입에 대해 알아보자. 먼저 아래와 같은 Box 클래스 코드가 있다. class Box{ Object item; void setItem(Object item) { this.item = item; } Object getItem(){ return item; } } 위 코드를 아래와 같이 수정할 수 있다. 클래스를 제네릭 클래.. 개발/Java 2022. 3. 6. String, StringBuilder, StringBuffer String 클래스에는 문자열을 저장하기 위해서 문자열 배열 참조 변수를 인스턴스 변수로 정의해놓고 있다. 인스턴스 생성 시 생성자의 매개변수로 입력받는 문자열은 이 인스턴스 변수에 문자형 배열에 저장되는 것이다. String VS StringBuilder, StringBuffer 차이 String 인스턴스가 갖고 있는 문자열은 읽어 올 수만 읽고, 변경할 수는 없다. 불변이다. (immutable) StringBuilfer, StringBuffer는 각각의 인스턴스에 저장된 문자열 변경이 가능하다. 가변적이다. (mutable) 즉 아래와 같이 '+'연산자를 이용해서 문자열을 결합하는 경우 인스턴스 내의 문자열이 바뀌는 것이 아니라 새로운 문자열 "ab"이 담긴 String 인스턴스가 생성되는 것이다... 개발/Java 2022. 3. 1. 접근 제어자 접근 제어자 접근 제어자는 멤버 또는 클래스에 사용되어, 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다. 클래스나 멤버 변수, 생성자에 접근 제어자가 지정되어 있지 않다면, 접근 제어자가 default(package-private)임을 뜻한다. 접근 제어자는 클래스, 멤버 변수, 메서드, 생성자에서 사용 가능하며 접근 제어자는 아래와 같이 정리할 수 있다. private : 같은 클래스 내에서만 접근이 가능하다. protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능하다. default(package-private) : 같은 패키지 내에서만 접근이 가능하다. public : 접근 제한이 전혀 없다. 접근 범위가 넓은 쪽에서 좁은 쪽의 순.. 개발/Java 2022. 2. 28. final 제어자 final 제어자 final은 '마지막의' 또는 '변경될 수 없는'의 의미를 가지고 있으며 거의 모든 대상에 사용될 수 있다. 변수에 사용되면 값을 변경할 수 없는 상수가 되며, 메서드에 사용되면 오버라이딩을 할 수 없게 되고, 클래스에 사용되면 자신을 확장하는 자손 클래스를 정의하지 못하게 된다. 아래는 final 제어자 사용에 대해 정리한 표다. 클래스 변경될 수 없는 클래스. 확장될 수 없는 클래스가 된다. 그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다. 메서드 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다. 멤버변수 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다. 지역변수 변수 앞에 final이 붙으면, 값을 .. 개발/Java 2022. 2. 28. package(패키지) Package(패키지 ) package, 즉 패키지란 클래스의 묶음이다. 패키지에는 클래스 또는 인터페이스를 포함시킬 수 있다. 또한 서로 관련된 클래스를 그룹 단위로 묶어 놓음으로써 클래스를 효율적으로 관리할 수 있다. 사실 클래스의 실제 이름은 패키지명을 포함한 것이다. 예를 들면 String클래스의 실제 이름은 java.lang.String이다. 그래서 같은 이름의 클래스일 지라도 서로 다른 패키지에 속하면 패키지명으로 구별이 가능하다. 클래스가 물리적으로 하나의 클래스파일(.class)인 것과 같이 패키지는 물리적으로 하나의 디렉토리다. 패키지의 선언은 아주 간단한다. package 패키지명; 클래스나 인터페이스의 소스파일의 맨 위에 다음과 같이 한 줄만 적어주면 된다. 위와 같은 패키지 선언문은.. 개발/Java 2022. 2. 28. 가변인자(varargs) 기존에는 메서드의 매개변수 개수가 고정적이었으나, JDK1.5부터 동적으로 지정해 줄 수 있게 되었으며, 이 기능을 가변 인자라고 한다. 가변 인자는 '타입... 변수명'과 같은 형식으로 선언하며. PrintStream 클래스의 printf()가 대표적인 예다. public PrintStream printf(String format, Object... args) { ... } 위와 같이 가변 인자 외에도 매개변수가 더 있다면, 가변 인자를 매개변수 중에서 제일 마지막에 선언해야 한다. 그렇지 않다면, 컴파일 에러가 발생한다. 가변 인자인지 아닌지를 구별할 방법이 없기 때문에 허용하지 않는 것이다. 이제 아래 코드를 살펴보자. String concatenate(String s1, String s2){ .... 개발/Java 2022. 2. 27. 오버로딩과 오버라이딩 오버로딩 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩, 즉 오버로딩이라고 한다. 오버로딩에는 몇 가지 조건이 있다. 메서드 이름이 같아야 한다. 매개변수의 개수 또는 타입이 달라야 한다. 메서드의 이름이 같다 하더라도 매개변수가 다르면 서로 구별될 수 있다. 매개변수에 의해서만 구별되므로 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다. 위의 조건을 만족시키지 못하는 메서드는 중복 정의로 간주되어 컴파일 시 오류가 발생한다. 이제 예시를 통해 알아보겠다. long add(int a, long b) { return a+b;} long add(long a, int b) { return a+b;} 두 메서드는 int형과 long형 매개변수가 하나씩 선언되어 있지만,.. 개발/Java 2022. 2. 26. 클래스 메서드(static 메서드)와 인스턴스 메서드 메서드 앞에 static이 붙어 있으면 클래스 메서드, 붙어 있지 않으면 인스턴스 메서드다. 클래스 메서드도 클래스 변수처럼, 객체를 생성하지 않고도 '클래스이름.메서드이름'과 같은 식으로 호출이 가능하다. 반면에 인스턴스 메서드는 반드시 객체를 생성해야만 호출할 수 있다. 인스턴스 메서드는 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드다. 인스턴스 변수는 인스턴스를 생성해야만 만들어지므로 인스턴스 메서드 역시 인스턴스를 생성해야만 호출이 가능하다. 반면에 메서드 중에서 인스턴스와 관계없는(인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드를 클래스 메서드(static) 메서드로 정의한다. 클래스를 설계할 때, 멤버 변수 중 모든 인스턴스에 .. 개발/Java 2022. 2. 24. 클래스 변수, 인스턴스 변수, 지역 변수 변수는 클래스 변수, 인스턴스 변수, 지역변수 모두 세 종류가 있다. 변수의 종류를 결정짓는 중요한 요소는 '변수의 선언된 위치'이므로, 변수의 종류를 파악하기 위해서는 변수가 어느 영역에 선언되었는지를 확인하는 것이 중요하다. 멤버 변수를 제외한 나머지 변수들은 모두 지역 변수다. 멤버 변수 중 static이 붙은 것은 클래스 변수, 붙지 않은 것은 인스턴스 변수다. 변수 예시 class Variables{ int iv; //인스턴스 변수 static int cv; //클래스 변수, static 변수 void method(){ int lv=0; //지역 변수 } } 인스턴스 변수 클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어진다. 인스턴스 변수의 값을 읽어 오거나 저장하기 위해서는 먼저.. 개발/Java 2022. 2. 24. 이전 1 2 3 4 다음 반응형