Post

기강 자바-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
      • 여러 스레드가 컬렉션에 접근하는 것을 방지하여 안전한 순회가 가능하게 해줌.



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.