기강 자바-03
자바의 기본 문법
- 이번에는 자바의 기본적인 문법들에 대해 알아본다.
static
- static은 정적 멤버 변수나 정적 메소드를 정의하는데 사용되는 키워드이다.
- static은 인스턴스가 아닌, 클래스 정보에 속해있다.
- 따라서 인스턴스를 생성하지 않아도
- 혹은 모든 인스턴스를 통해서 접근할 수 있다.
- 정적 멤버 변수는 클래스가 로드되는 시점에 메모리를 할당 받는다.
- 따라서 메모리 사용량이 증가할 수 있다.
- 왜요? 사용되는 시점에 올라왔다 소멸되는 것이 아닌, 클래스 로딩 시점부터 프로그램 종료 시점까지 메모리를 잡아먹으니까~
정적 필드 정의하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Person {
public static int age = 10;
public static void printAge() {
sout(age);
}
}
class Main {
public static void main(String[] args) {
Person person = new Person();
sout(person.age); // 인스턴스를 통해 정적 멤버 변수에 접근
sout(Person.age); // 클래스를 통해 정적 멤버 변수에 접근
person.printAge(); // 10, 인스턴스를 통해 정적 메소드 호출
Person.printAge(); // 10, 클래스를 통해 정적 메소드 호출
person.age = 20; // 인스턴스를 통해 정적 메소드의 값 변경
Person.printAge(); // 20, 클래스를 통해 값을 출력
Person.age = 30; // 클래스를 통해 정적 메소드의 값 변경
person.printAge(); // 30, 인스턴스를 통해 값을 출력
}
}
- Person 클래스에 정적 멤버 변수와 정적 메소드가 정의된 것을 볼 수 있다.
- 인스턴스와 클래스 모두 정적 변수와 메소드에 접근할 수 있는 것을 볼 수 있다.
- 인스턴스로 접근하나, 클래스로 접근하나 클래스 정보에 있는 static 필드에 접근하는 것이다.
- 따라서 같은 곳에 위치한 데이터에 접근하는 것을 알 수 있다.
- 글로벌한 상태를 클래스 및 모든 인스턴스와 공유한다.
- 따라서 멀티 스레드와 같은 환경에서 예상치 못한 결과를 초래할 수도 있다.
- 접근 제한자나 final 키워드 등을 사용해 잘 관리하는 것이 중요하다.
예외 처리
- 예외 처리란,
- 프로그램 실행 중에 예기치 않은 상황이 발생했을 때, 이런 상황들을 처리하는 방법들을 말한다.
- 예외가 발생하면 프로그램이 비정상적으로 종료될 수 있기 때문에,
- 적절한 예외 처리로 프로그램의 안정성을 높일 수 있다.
- 게시글 참고 ^~^
컬렉션
- 자바의 컬렉션 프레임워크란,
- 자바에서 제공하는, 자료 구조를 다루기 위한 클래스 및 인터페이스들이다.
- 컬렉션 프레임워크를 사용해 데이터를 더 편하게 관리 및 조작할 수 있다.
- 컬렉션 프레임워크에 인터페이스와 클래스는 매우 방대하며, 다음과 같은 것들이 있다.
- List
- Set
- Map
- Iterator
- Comparator
List
- 리스트에는 다음과 같은 구현체들이 있다.
- 배열 리스트
- 연결 리스트
- 리스트는
- 선형 자료구조이다.
- 순서가 존재한다.
- 인덱스를 통해 원소에 접근이 가능하다.
- 길이에 제한이 없다.
- 선형 자료구조이다.
Set
- Set은 다음과 같은 구현체들이 있다.
- HashSet
- TreeSet
- LinkedHashSet
- 집합은
- 순서가 존재하지 않는다. (LinkedHashSet 제외)
- 요소들의 중복이 허용되지 않는다.
Map
- 맵의 구현체는 다음과 같은 것들이 있다.
- HashMap
- TreeMap
- LinkedHashMap
- ConcurrentHashMap
- 맵은
- 키-값의 쌍으로 이뤄진 자료구조이다.
- 키를 통해 값에 접근할 수 있다.
Iterator
- 이터레이터는 컬렉션 데이터 구조에 접근하기 위해 사용하는 애다.
- 데이터에 순차적으로 접근하면서 데이터를 읽거나 수정하는 등의 작업을 할 수 있다.
- 반복문 쓰면 되잖아요 굳이 왜 써요?
- 여러 컬렉션 타입에서 Iterator를 통해 동일한 방법으로 요소를 다룰 수 있다.
- 구체적으로 어떤 타입인지 알 필요가 없음
- forEach문 등 다른 반복문보다 좀 더 많은 것을 할 수 있다.
- 요소의 제거 등
- 불필요한 메모리 사용 방지
- Iterator는 필요한 요소만 딱 접근하고 제어하고 끝
- 반복문은 내부 요소를 일일이 접근해야 하기 때문에 메모리 사용량이 증가할 수 있다.
- Thread-Safe
- 여러 스레드가 컬렉션에 접근하는 것을 방지하여 안전한 순회가 가능하게 해줌.
- 여러 컬렉션 타입에서 Iterator를 통해 동일한 방법으로 요소를 다룰 수 있다.
Comparator
- 요소들을 비교하고 순서를 정하는데 사용되는 인터페이스이다.
- 주로 정렬 작업에 많이 사용된다.
- compare() 추상 메서드 하나만 가지고 있다.
- 함수형 인터페이스로 람다식으로 표현이 가능하다.
- 리턴 타입은 int형인데 a와 b 요소 둘을 비교한다고 할 때,
- a > b 이면, 양수
- a == b 이면, 0
- a < b 이면, 음수
1
2
3
4
5
6
7
List<Integer> intList = new ArrayList<>();
List<Person> personList = new ArrayList<>();
Collections.sort(intList, Comparator.naturalOrder()); // ASC 정렬
Collections.sort(intList, Comparator.reverseOrder()); // DESC 정렬
Collections.sort(personList, Comparator.comparing(x -> x.getAge())); // Person 객체의 age 값으로 ASC 정렬
- Comparator를 사용해 정렬시에 요소들을 비교하는 방법을 제시해줄 수 있다.
- 위의 경우 자바에서 제공하는 Comparator 구현체를 통해 간단하게 정렬한 예이다.
- 아래의 경우 함수형 인터페이스인 Comparator를 람다식으로 구현한 예이다.
과제
- 리스트를 구현해 보시고 둘의 특징 및 차이, 장단점을 설명해 보세요.
- ArrayList
- LinkedList
과제
- 자바에서 변수의 스코프와 라이프 사이클에 대해 알아보고 설명 하세요.
- 자바의 타입 변환에 대해 알아보고 설명 하세요.
- 타입 캐스팅
- 타입 프로모션
- 자바의 인스턴스 초기화 블럭을 알아보고 사용해 보세요.
- 스태틱 블럭
This post is licensed under CC BY 4.0 by the author.