Java 34. 중첩 클래스와 중첩 인터페이스 (nested class) 중첩 클래스란 클래스 내부에 선언한 클래스를 말한다. 중첩 클래스를 사용하면 두 클래스의 멤버들을서로 쉽게 접근할 수 있고, 외부에는 불필요한 관계 클래스를 감춰주면서 코드의 복잡성을 줄일 수 있다는 장점이 있다. 인터페이스도 클래스 내부에 선언할 수 있다, 이런 인터페이스를 중첩 인터페이스라고 한다. 인터페이스를 클래스 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위해서다. Java 2023.04.06
Java 33. Lambda expression 람다식 람다식이란? 람다식은 JDK1.8부터 추가되었다. 람다의 도입으로 자바는 객체지향언어인 동시에 함수형 언어가 되었다. 람다식은 간단히 말해서 메서드를 하나의 '식(expression)'으로 표현한 것이다. 람다식은 함수를 간략하면서도 명확한 식으로 표현할 수 있게 해 준다. 메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로, 람다식을 익명함수(anonymous function)이라고도 한다. 위에 작성된 아래쪽 코드에서 () ㅡ> (int) (Math.random()*5)+1이 람다식이다. 위에쪽 코드의 메서드보다 람다식이 간결하고 이해하기 쉽다. 모든 메서드는 클래스에 포함되어야 하므로 클래스도 새로 만들어야 하고, 객체도 생성해야만 메서드를 호출할 수 있다. 그러나 람다식은 이 모든 과.. Java 2023.04.05
Java 32. TreeSet TreeSet은 이진 검색 트리(binary search tree)라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스이다. 이진 검색 트리는 정렬, 검색, 범위검색(range search)에 높은 성능을 보이는 자료구조이며 TreeSet은 이진 검색 트리의 성능을 향상한 트리로 구현되어 있다. Set인터페이스를 구현했으므로 중복된 데이터의 저장을 허용하지 않으며 정렬된 위치에 저장하므로 저장순서를 유지하지도 않는다. 이진트리는 링크드리스트처럼 여러 개의 노드(node)가 서로 연결된 구조로, 각 노드에 최대 2개의 노드를 연결할 수 있으며 루트(root)라고 불리는 하나의 노드에서부터 시작해서 계속 확장해 나갈 수 있다. 위아래로 연결된 두 노드를 부모ㅡ자식 관계에 있다고 하며 위의 노드를 부모 노드.. Java 2023.04.04
Java 31. HashSet HashSet은 Set 인터페이스를 구현한 가장 대표적인 컬렉션이며, Set인터페이스의 특징대로 HashSet은 중복된 요소를 저장하지 않는다. HashSet에 새로운 요소를 추가할 때는 add메서드나 addAll메서드를 사용하는데, 만약 HashSet에 이미 저장되어 있는 요소와 중복된 요소를 추가하고자 한다면 이 메서드들은 false를 반환함으로써 중복된 요소이기 때문에 추가에 실패했다는 것을 알린다. 이러한 HashSet의 특징을 이용하면, 컬렉션 내의 중복 요소들을 쉽게 제거할 수 있다. ArrayList와 같이 List인터페이스를 구현한 컬렉션과 달리 HashSet은 저장순서를 유지하지 않으므로 저장순서를 유지하고자 한다면 LinkedHashSet을 사용해야 한다. (HashSet은 내부적으로 .. Java 2023.04.03
Java 30. Map collection Map 컬렉션은 키와 값으로 구성된 Map.Entry 객체를 저장하는 구조를 가지고 있음. Entry는 Map 인터페이스 내부에 선언된 중첩 인터페이스이고, 키와 값은 모두 객체 키는 중복 저장될 수 없고 값은 중복 저장될 수 있음. 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대체됨! Map 컬렉션에는 HashMap, Hashtable, LinkedHashMap, Properties, TreeMap 등이 있다. HashMap HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션이다. HashMap의 키로 사용할 객체는 hashCode()와 equals() 메서드를 재정의해서 동등 객체가 될 조건을 정해야 한다 / 객체가 달라도 동등 객체라면 같은 키로 .. Java 2023.04.02
Java 29. 추상클래스, 추상메서드 (abstract class, abstract method) 추상클래스란? 클래스의 설계도에 비유한다면, 추상클래스는 미완성 설계도에 비유할 수 있다. 미완성 설계도란, 단어의 뜻 그대로 완성되지 못한 채로 남겨진 설계도를 말한다. 클래스가 미완성이라는 것은 멤버의 개수에 관계된 것이 아니라, 단지 미완성 메서드(추상 메서드)를 포함하고 있다는 의미이다. 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상클래스로 인스턴스는 생성할 수 없다. 추상클래스는 상속을 통해서 자손클래스에 의해서만 완성될 수 있다. 추상클래스 자체로는 클래스로서의 역할을 다 못하지만, 새로운 클래스를 작성하는데 있어서 바탕이 되는 조상클래스로서 중요한 의미를 갖는다. 새로운 클래스를 작성할 때 아무 것도 없는 상태에서 시작하는 것보다는 완전하지는 못하더라도 어느 정도 틀을 갖춘 상태에서 시.. Java 2023.04.01
Java 28. Serialization- ObjectInputStream, ObjectOutputStream (직렬화, 역직렬화) 직렬화는 객체를 데이터 스트림으로 만드는 것을 뜻한다. 다시 얘기하면 객체에 저장된 데이터를 스트림에 쓰기 위해 연속적인 데이터로 변환하는 것을 말한다. 반대로 스트림으로부터 데이터를 읽어서 객체를 만드는 것을 역직렬화(deserialization)라고 한다. 직렬화라는 용어 때문에 굉장히 어렵게 느껴질 수 있다 (사실 어렵다.. ) 객체는 클래스에 정의된 인스턴스변수의 집합이다. 객체에는 클래스변수나 메서드가 포함되지 않는다. 객체는 오직 인스턴스변수들로만 구성되어 있다. ObjectInputStream, ObjectOutputStream 직렬화(스트림에 객체를 출력)에는 ObjectOutputStream을 사용하고 역직렬화(스트림으로부터 객체를 입력)에는 ObjectInputStream을 사용한다. .. Java 2023.03.30
Java 27. 입출력 스트림 IO Stream (Input Stream, Output Stream) 연습 자바에서의 입출력이란 Input / Output의 약자로 IO라고도 한다. 입출력은 내부 또는 외부의 장치 프로그램 간의 데이터를 주고받는 것을 말한다. 예를 들면 키보드로부터 데이터를 입력받는 것과, System.out.println()을 이용해서 화면에 출력한다던가 하는 것이 기본적인 입출력의 예이다. Streme 스트림 - 자바에서 입출력을 수행하려면, 어느 한쪽에서 다른 쪽으로 데이터를 전달하려면, 두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요한데 이것을 스트림(Stream)이라고 정의했다. (스트림이란 데이터를 운반하는 데 사용되는 연결통로이다!) 스트림의 종류에는 여러 가지 종류의 스트림이 있는데 크게 두 가지 종류로 구분된다. 바이트(byte) 기반 스트림: 그림. 멀티미디어 등.. Java 2023.03.29
Java26. List 컬렉션 리스트의 특징 (ArrayList, Vector, LinkeList) List 컬렉션은 배열과 비슷하게 객체를 인덱스로 관리. 배열과의 차이점은 저장 용량이 자동으로 증가, 객체를 저장할 때 자동 인덱스가 부여됨. 추가, 삭제, 검색을 위한 다양한 메서드들이 제공됨. List 컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조함. 그렇기 때문에 동일한 객체를 중복 저장할 수 있고, 이 경우 동일한 번지가 참조됨 null도 저장이 가능하고 해당 인덱스는 객체를 참조하지 않음. List 컬렉션에 객체를 추가할 때에는 add() 메서드를 사용, 객체를 찾아올 때에는 get() 메서드를 사용, 객체 삭제는 remove() 메서드를 사용하고 List 컬렉션에 저장된 모든 객체를 대상으로 하나씩 가져와 처리하고 싶다면 인덱스를 이용하는 방법과 향상된 for 문을 이용하는 .. Java 2023.03.28
Java25. Collections Framework (컬렉션 프레임워크) 컬렉션 프레임워크란, 데이터 군을 저장하는 클래스들을 표준화한 설계를 뜻한다. 컬렉션(Collection)은 다수의 데이터, 즉 데이터 그룹을, 프레임워크는 표준화된 프로그래밍 방식을 의미한다. JDK1.2 이전까지는 Vector, Hashtable, Properties와 같은 컬렉션 클래스, 다수의 데이터를 저장할 수 있는 클래스, 들을 서로 다른 각자의 방식으로 처리해야 했으나 JDK1.2부터 컬렉션 프레임워크가 등장하면서 다양한 종류의 컬렉션 클래스가 추가되고 모든 컬렉션 클래스를 표준화된 방식으로 다룰 수 있도록 체계화되었다. 컬렉션 프레임워크는 컬렉션, 다수의 데이터를 다루는데 필요한 다양하고 풍부한 클래스들을 ㅈ[공하기 때문에 프로그래머의 짐을 상당히 덜어 주고 있으며, 또한 인터페이스와 다형.. Java 2023.03.27