Java/문법

[Java] 핵심 기본편 - 추상클래스와 인터페이스, 제네릭스(제네릭스, 제네릭 클래스, Wrapper 클래스, ArrayList, LinkedList, HashSet, HashMap, Iterator)

Se On 2024. 7. 2. 22:27

1. 추상클래스와 인터페이스

추상클래스

  • 추상클래스: 아직 완성되지 않은 클래스
  • abstract class 클래스명 {}
  • 아래 Shape 클래스는 완성되지 않은 추상 클래스지만, 상속하는 자식 클래스에서 메소드를 완성시켜 추상 클래스를 활용할 수 있음 
// 추상 클래스
abstract class Shape{ // Shape: 클래스
	abstract double calculateArea(); // calculateArea: 도형 크기를 재는 메소드
}

// 정사각형 클래스
class Square extends Shape { // Square: Shape 클래스 상속
    private double s; // 한 면의 길이
    public Square(double s) {
        this.s = s;
    }
    double calculateArea() {
        return s * s; // 면적 계산 메소드 완성
    }
}

// 원 클래스
class Circle extends Shape { // Circle: Shape 클래스 상속
    private double r; // 반지름
    public Circle(double r) {
        this.r = r;
    }
    double calculateArea() {
        return Math.PI * r * r; // 면적 계산 메소드 완성
    }
}

 

인터페이스

  • 인터페이스: 클래스를 작성할 때 기본이 되는 뼈대
  • interface 인터페이스명{}
    • implements를 통해서 구현할 수 있음
    • interface에 선언되어 있는 메소드를 구현하려는 클래스에서 모두 적용할 수 있음
// 위 추상 클래스 Shape을 인터페이스로 변경하기
interface Shape{
    double calculateArea();
}

// Shape 인터페이스를 구현하여 Square 클래스 만들기
class Square implements Shape {
    private double s;
    public Square(double s) {
        this.s = s;
    }
    double calculateArea() {
        return s * s;
    }
}

// Circle 클래스
class Circle implements Shape {
    private double r;
    public Circle(double r) {
        this.r = r;
    }
    double calculateArea() {
        return Math.PI * r * r;
    }
}

 

2. 제네릭스

제네릭스

  • 제네릭스: 다양한 형태의 데이터를 일반화하여 다룰 수 있게 해 주는 것
    • 장점: 코드의 재사용성을 높이고 타입 안정성을 확보할 수 있음
  • T 변수명
// 메인 메소드 - 세 개의 서로 형이 다른 변수
public static void main(String[] args) {
    int intValue = 3;
    double doubleValue = 3.14;
    String stringValue = "안녕";
    
    printValue(intValue);
    printValue(doubleValue);
    printValue(stringValue);
}

// 각 메소드의 형태는 int, double, String
public static void printValue(int value) { // int
	System.out.println(value);
}

public static void printValue(double value) { // double
	System.out.println(value);
}

public static void printValue(String value) { // String
	System.out.println(value);
}

// 위 상황에서 제네릭스 활용 가능!
public static <T> void pirntValue (T value) {
	System.out.println(value);
}

 

 

제네릭 클래스

  • 제네릭 클래스: 제네릭 기반 클래스(다양한 데이터 유형을 처리할 수 있도록 설계된 클래스)
  • class 클래스명 <T> {}
    • 제네릭 클래스를 사용하기 위해서는 클래스 뒤에 어떤 데이터를 담을지를 먼저 정의해 주어야 함
// BoxInteger 클래스: 정수를 담을 수 있음
class BoxInteger {
    int data;
    public void setData(int data) {
        this.data = data;
    }
}

// BoxString 클래스: 문자열을 담을 수 있음
class BoxString {
    String data;
    public void setData(String data) {
        this.data = data;
    }
}

// 메인 메소드 - 위 두 개의 클래스 사용하기
public static void main(String[] args) {
    BoxInteger iBox = new BoxInteger();
    iBox.setData(3); // 정수 담기
    
    BoxString sBox = new BoxString();
    sBox.setData("안녕"); // 문자열 담기
}

// 제네릭 클래스
class Box<T> { // 정수와 문자열 모두 담을 수 있는 Box 클래스
    T data;
    public void setData(T data) {
        this.data = data;
    }
}

public static void main(String[] args) {
    Box<Integer> iBox = new Box<>(); // <Integer> 정수 담기
    iBox.setData(3);
    
    Box<String> sBox = new Box<>(); // <String> 문자열 담기
    sBox.setData("안녕");
}

 

Wrapper 클래스

  • Wrapper 클래스: 기본 자료형을 객체로 Wrapping + 추가 기능을 제공하는 클래스
대표적인 Wrapper 클래스 감싸지는 자료형
Integer int
Double double
Character char
// 메인 메소드
public static void main(String[] args) {
    int i = 1;
    double d = 1.0;
    char c = 'a';
}

// Wrapper 클래스로 변환하기
public static void main(String[] args) {
    Integer i = 1;
    Double d = 1.0;
    Character c = 'a';
    
    // 추가 기능
    System.out.println(i.intValue());
    System.out.println(d.intValue()); // double을 int로 변환하여 출력하기
    System.out.println(c.charValue());
}

 

ArrayList

  • ArrayList: 배열 기반 리스트, 빠른 접근 + 순차 저장
  • ArrayList<T>
    • Arraylist<String> list = new ArrayList<>();
// ArrayList<String>: 문자열을 담기 위한 ArrayList
public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>();
    list.add("철수"); // list.add: list에 값을 추가
    list.add("영희");
    
    // 리스트 내 데이터 순회
    for (String s: list) {
        System.out.println(s);
    }
}
기능 설명 예시 결과
add 추가 list.add("철수"); {"철수"}
get 가져오기 list.get(0); "철수"
size 크기 list.size(); 1
set 수정 list.set(0, "영희"); {"영희"}
contains 포함 여부 list.contains("영희"); true
(미포함: false)
remove 삭제 list.remove("영희"); { }
clear 전체 삭제 list.clear(); { }

 

LinkedList

  • LinkedList: 연결 리스트, 데이터의 빠른 삽입 + 삭제
  • LinkedList<T>
    • LinkedList<String> list = new LinkedList<>();
// LinkedList
public static void main(String[] args) {
    LinkedList<String> list = new LinkedList<>();
    list.add("철수");
    list.add("영희");
    
    // 리스트 내 데이터 확인을 위한 for문
    for (String s: list) {
        System.out.println(s);
    }
}
기능 설명 예시 결과
add 추가 list.add("철수"); {"철수"}
get 가져오기 list.get(0); "철수"
getFirst 처음 요소 가져오기 list.getFirst(); "철수"
getLast 마지막 요소 가져오기 list.getLast(); "철수"
addFist 맨 앞에 추가하기 list.addFirst("영희"); {"영희", "철수"}
addLast 맨 뒤에 추가하기 list.addLast("영철"); {"영희", "철수", "영철"}
clear 전체 삭제 list.clear(); { }

 

HashSet

  • HashSet: 순서, 중복을 허용하지 않는 데이터의 집합
  • HashSet<T>
    • HashSet<String> set = new HashSet<>();
// HashSet
public static void main(String[] args) {
    HashSet<String> set = new HashSet<>();
    set.add("철수");
    set.add("영희");
    set.add("철수");
    // {"철수", "영희"} 중복 허용X
}
기능 설명 예시 결과
add 추가 set.add("철수"); {"철수"}
contains 포함 여부 set.contains("영희"); false
size 크기 set.size(); 1
remove 삭제 set.remove("철수"); { }
clear 전체 삭제 set.clear(); { }

 

HashMap

  • HashMap: (Key, Value)를 쌍으로 저장하는 자료구조, 중복X 순서X
  • HashMap<K, V>
    • HashMap<String, Integer> map = new HashMap<>();
// HashMap
public static void main(String[] args) {
    HashMap<String, Integer> map = new HashMap<>(); // <이름, 점수>
    map.put("철수", 100);
    map.put("영희", 90);
}

HashMap 결과

기능 설명 예시 결과
put 추가 map.put("철수", 100); {"철수":100}
size 크기 map.size(); 1
get 가져오기 map.get("철수"); 100
containsKey Key 포함 여부 map.containsKey("영희"); false
remove 삭제 map.remove("철수"); { }
clear 전체 삭제 map.clear(); { }

 

Iterator

  • Iterator: 컬렉션의 모든 데이터 순회
  • Iterator<T>
    • Iterator<String> it = list.iterator();
// ArrayList<String>: 문자열을 담기 위한 ArrayList
public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>();
    list.add("철수"); // list.add: list에 값을 추가
    list.add("영희");
    
    // Iterator를 사용하여 리스트 내 데이터 순회
    Iterator<String> it = list.iterator();
    while (it.hasNext()) {
        System.out.println(it.next());
    }
}
기능 설명 예시 결과
hasNext 다음 요소 확인 it.hasNext() true
next 다음 요소 가져오기 it.next() "철수"
remove 삭제 it.remove() { }

 


참고 영상: 나도코딩 - 자바 무료 강의 2시간 완성(1분 자바)

https://youtu.be/DNCBaeCoMug?si=VM02QD9igeT561pp

 

 

반응형