2. 자바 기초 지식 복습

DAEILLIM·2023년 11월 8일
0
post-thumbnail

이번 장에서는 스프링 프레임워크를 학습하기 전, 실습할 때 꼭 필요한 자바의 기초 지식으로 인터페이스(Interface), 리스트(List)에 대해 학습하는 장입니다. 이미 충분히 알고 있다면 넘어가도 좋습니다.


1. 인터페이스(Interface)

인터페이스(Interface)는 클래스에 포함하는 메서드의 구체적인 내용을 작성하지 않고 상수와 메서드 타입만 정의한 것을 의미합니다. 자바에서 인터페이스는 다음과 같은 특징을 갖습니다.


  1. 추상 메서드

    • 인터페이스 내의 메서드는 구현 내용이 없이 메서드 시그니처만을 정의
    • 하위 클래스에서 반드시 구현해야 함
  2. 다중 상속

    • 자바에서 클래스는 다중 상속을 지원하지 않지만, 여러 인터페이스 구현이 가능
    • 클래스는 여러 인터페이스에서 정의한 메서드를 모두 구현이 가능
  3. 계약(Contract)

    • 클래스가 어떤 메서드를 반드시 제공해야 한다는 계약(Contract)을 정의
    • 클래스가 특정 인터페이스를 상속하면 해당 인터페이스의 메서드를 반드시 구현해야 함
  4. 인터페이스 상속

    • 인터페이스도 다른 인터페이스로부터 상속이 가능
    • 여러 인터페이스를 조합하여 더 큰 기능을 제공하는 새로운 인터페이스 생성이 가능

인터페이스를 사용하면 코드의 재사용성을 높이고, 다형성을 구현할 수 있으며, 클래스 간에 강한 결합을 피할 수 있습니다. 자바에서 인터페이스는 "interface" 키워드를 사용하여 정의하고, 클래스에서는 "implements" 키워드를 사용하여 해당 인터페이스를 구현할 수 있습니다.


인터페이스 선언하기

public interface MyInterface {
    // 인터페이스에 정의할 메서드나 상수를 선언합니다.
    
    // 추상 메서드 (구현이 없는 메서드)
    void myMethod();
    
    // 상수 (final 변수)
    int MY_CONSTANT = 100;
}

여기에서 설명드릴 코드 내용은 다음과 같습니다.

  1. public 접근 제어자

    • 인터페이스 선언은 보통 public 접근 제어자를 사용하여 선언
    • 이렇게 하면 해당 인터페이스를 다른 패키지에서도 접근이 가능
  2. interface 키워드

    • 인터페이스를 정의할 때 interface 키워드를 사용
    • 인터페이스는 추상 형식의 메서드와 상수만을 정의하며 객체를 직접 생성 불가능
  3. 추상 메서드

    • 인터페이스 내에는 메서드의 시그니처만을 정의하고, 메서드의 구현 내용을 포함하지 않음( = "추상 메서드")

    위의 예제에서 myMethod는 추상 메서드로, 클래스에서는 인터페이스의 추상 메서드를 구현해야 합니다.

  4. 상수

    • 인터페이스 내에 상수를 정의 가능
    • 상수는 final 키워드를 사용하여 정의되며, 수정이 불가능

    위의 예제에서 MY_CONSTANT는 인터페이스 내의 상수입니다.

인터페이스는 다른 클래스에서 구현하는 것을 전제로 생성합니다. 그 떄문에 인터페이스를 선언한 메서드는 암묵적으로 public abstract 접근 제어자(access modifier)가 붙은 추상 클래스라고 불립니다. 또한 인터페이스에 변수를 선언한 경우는 암묵적으로 public static final 한정자가 붙어서 상수가 됩니다.

public interface MyInterface {
    // 인터페이스에 정의할 메서드나 상수를 선언합니다.
    
    // 추상 메서드 (구현이 없는 메서드)
    public abstract void myMethod();
    
    // 상수 (final 변수)
    public static final int MY_CONSTANT = 100;
}

인터페이스 구현하기

public class MyClass implements MyInterface {
    // MyInterface에서 정의한 추상 메서드 구현
    @Override
    public void myMethod() {
        System.out.println("MyMethod 구현");
    }

    // 다른 클래스에서도 사용할 수 있는 일반 메서드
    public void anotherMethod() {
        System.out.println("다른 메서드 호출");
    }
}

MyInterface 인터페이스의 구현 클래스인 MyClass 코드에서 주요 포인트는 다음과 같습니다.

  1. MyClass 클래스가 MyInterface 인터페이스를 구현하려면 implements 키워드를 사용합니다.
  2. myMethod 메서드는 MyInterface에서 정의한 추상 메서드이므로, 반드시 구체적인 구현을 제공해야 합니다.
    이 메서드를 @Override 어노테이션을 사용하여 재정의(override)합니다.
  3. MyClass 클래스에는 MyInterface에서 정의한 메서드 외에도 자체적인 메서드인 anotherMethod가 포함되어 있습니다.

이렇게 하면 MyClass 클래스는 MyInterface 인터페이스의 모든 요구사항을 충족시키며, MyInterface에 정의된 메서드를 사용할 수 있습니다. 이렇게 구현한 클래스를 다른 곳에서 인스턴스화하고 사용할 수 있습니다.

예를 들어 다음 Main 클래스의 코드와 같습니다.

public class Main {
    public static void main(String[] args) {
        MyClass myObj = new MyClass();
        myObj.myMethod(); // MyMethod 구현
        myObj.anotherMethod(); // 다른 메서드 호출
    }
}

위의 Main 클래스에서 MyClass 객체를 생성하고 myMethodanotherMethod를 호출하는 방법을 보여줍니다.


2. 리스트(List)


자바에서는 여러 개의 데이털르 취급하는 기능으로 배열이 있습니다. 배열은 길이가 정해져 있기 때문에 요소를 추가하거나 삭제하기가 어렵다는 단점이 있습니다. 그래서 자바에서는 복수의 데이터를 더 쉽게 사용할 수 있게 하는 컬렉션(Collection)이라는 클래스를 제공하고 있습니다. 컬렉션의 종류와 용도는 다음과 같습니다.

종류(인터페이스)설명
리스트(List)순차적으로 데이터 저장. 데이터 중복을 허용
세트(Set)비순차적으로 데이터 저장. 데이터 중복 허용하지 않음
맵(Map)키와 값의 쌍으로 이루어진 데이터 집합
비순차적으로 데이터 저장. 키의 중복 허용하지 않음. 값의 중복을 허용

리스트 개요

List는 컬렉션 프레임워크에서 제공하는 인터페이스입니다. 여러 데이터를 순서대로 정렬하여 저장할 때 사용합니다. 실제로 사용할 때는 List 인터페이스를 구현한 클래스를 사용해야 합니다. 리스트의 주요 구현 클래스는 ArrayList, LinkedList 가 있습니다.


리스트 인터페이스의 구현 클래스

구현개요
ArrayList- List 인터페이스의 구현 클래스에서 가장 많이 사용
- 요소를 배열로 유지하기 때문에 요소의 검색을 고속으로 처리가 가능
- 단, 요소의 수가 많아지면 추가/삭제를 처리하는 데 시간이 많이 걸림
LinkedList- 요소끼리 전후 양방향의 링크로 참조하는 리스트 구조를 이용해 관리
- 요소의 추가나 삭제가 ArrayList보다 빠름
- 그러나 특정 요소 검색과 같은 인덱스 값에 의한 무작위 엑세스에는 적합하지 않음

리스트 실습하기

import java.util.ArrayList;
import java.util.List;

public class ListExample {
    public static void main(String[] args) {
        // ArrayList 생성
        List<String> myList = new ArrayList<>();

        // 요소 추가
        myList.add("사과");
        myList.add("바나나");
        myList.add("체리");
        myList.add("딸기");

        // 요소 조회
        System.out.println("리스트의 첫 번째 요소: " + myList.get(0)); // "사과" 출력

        // 요소 순회
        System.out.println("모든 요소 출력:");
        for (String fruit : myList) {
            System.out.println(fruit);
        }

        // 요소 삭제
        myList.remove("바나나");

        // 리스트 크기 확인
        int size = myList.size();
        System.out.println("리스트의 크기: " + size);
    }
}

위의 코드는 다음과 같은 작업을 수행합니다.

  1. ArrayList 객체를 생성하고 List<String> 형식으로 선언합니다. 이 리스트는 문자열을 저장합니다.
  2. add 메서드를 사용하여 리스트에 요소를 추가합니다.
  3. get 메서드를 사용하여 리스트에서 특정 인덱스의 요소를 조회합니다.
  4. for-each 루프를 사용하여 리스트의 모든 요소를 순회하고 출력합니다.
  5. remove 메서드를 사용하여 리스트에서 요소를 제거합니다.
  6. size 메서드를 사용하여 리스트의 크기를 확인합니다.

이 코드를 실행하면 리스트를 만들고 요소를 추가, 조회, 삭제, 크기 확인 등 다양한 작업을 수행할 수 있습니다. 리스트는 자주 사용되는 자료 구조 중 하나이며, 데이터를 효율적으로 관리하는 데 도움이 됩니다.

profile
필기하고, 타이핑하고, 말하면서 읽고, 코딩하고, 눈으로 읽고 오감으로 공부하기

0개의 댓글