Hyogi's Notebook

Day07 JAVA Studying

by 효기’s

- 강사님

final을 ~쓰면

1. field → 상수

2. method → 오버라이드 금지

3. class → 상속 금지


- 강사님

 * 제네릭 클래스 = 기능은 똑같은데 타입이 다른것을 해결하려고 하는 것.
 * 타입 제한이 없다. (타입 제한이 없어서 int인데 float도 사용가능하다.)
 * 
 * 제네릭은 객체 타입만 사용가능하다.
 * EX) <int> (x) -> <Integer> (o)
 * 
 * 미결정 타입 = T (나중에 타입을 결정해)
 * 강제 타입 변환이 필요없어짐.
 * 
 * EX) 컵의 근본은 변하지 않지만 안에 뭘 넣느냐에 따라 물컵, 사이다컵이 된다.
 * 
 * import static java.lang.System.out; (println 으로 출력가능)

 

제네릭 클래스는 타입 매개변수를 사용하여 다양한 타입의 데이터를 처리할 수 있는 클래스입니다. 

타입 매개변수는 클래스 내부에서 사용되는 변수의 타입을 나타내는데, 

실제 사용 시에 구체적인 타입으로 대체됩니다. 이를 통해 코드의 재사용성과 타입 안정성을 높일 수 있습니다.

package Test;

public class study38_0711<T>{
	
	public T content; // 타입을 선언해주지 않음.
	
	public static void main(String[] args) {
		
		study38_0711<String> box1 = new study38_0711<String>(); // string으로 타입 입력
		box1.content = "안녕하세요.";
		String str = box1.content;
		System.out.println(str); // 안녕하세요 출력
		
		study38_0711<Integer> box2 = new study38_0711<Integer>(); // int로 타입 변경
		box2.content = 100;
		int value = box2.content;
		System.out.println(value); // 100 출력
	}
	
}
package Test;

import static java.lang.System.out;


public class study39<T> {

	T[] v;
	
	public void set(T[] n) {
		v = n;
	}
	
	public void print() {
		for(T s : v)
			out.println(s);
	}
	
	public static void main(String[] args) {
		// 타입 제한이 없음.
		study39<String> t = new study39<String>();
		
		String[] ss = {"애", "아", "서"};
		t.set(ss);
		t.print(); // 애 아 서
		
		
		study39 t1 = new study39();
		
		Integer[] s = {1, 2, 3};
		t1.set(s);
		t1.print(); // 1 2 3
		
	}

}

컬렉션 프레임워크

List(ArrayList(가장많이씀, 한칸씩 밀림, 쓰레드 동기화o), VectorLinkedList(하나만 빼고 연결할수있음, 쓰레드 동기화x)
 = 순서 유지하고 저장, 중복 저장가능. (데이터를 모을때)
 
Set(HashSetTreeSet)
 = 순서 유지하지 않고 저장, 중복 저장 안됨.(중복 입력자체가 안됨) 
 
Map(HashMap(null을 혀용, 쓰레드 동기화x), HashtableTreeMapProperties)
 = 키와 값으로 구성된 엔트리 저장, 키는 중복 저장 안됨. 

 

HashSet

package Test;

import java.util.*;
import static java.lang.System.out;


public class study40 {
	
	public static void main(String[] args) {
		String[] str = {"Java", "Beans", "Java", "XML"};
		
		HashSet<String> hs1 = new HashSet<String>();
		HashSet<String> hs2 = new HashSet<String>();
		
		for (String n : str) {
			if(!hs1.add(n)) // str 값이 아니면 
				hs2.add(n); // hs2에 넣어라.
		}
		out.println("hs1:" + hs1); // 중복된 값 넣지 못해서 java, beans, xml
		
		hs1.removeAll(hs2); // 2번 배열에 있는 java를 제거
		
		out.println("hs1:" + hs1); // beans, xml 출력
		out.println("hs2:" + hs2); // hs2는 자바 인덱스라서 java출력

	}

}

Map Ex1

package Test;

import java.util.*;
import static java.lang.System.out;

public class study41 {
	
	public static void main(String[] args) {
		
		String[] msg = {"Berlin", "Dortmund", "Frankfurt", "Gelsenkirchen", "Hamburg"};
		
		HashMap<Integer, String> map = new HashMap<Integer, String>();
		
		for(int i = 0; i < msg.length; i++) // msg의 길이만큼 반복
			map.put(i, msg[i]); // (0, msg[0] ~ 4, msg[4]를 map에 넣음)
		
		Set<Integer> keys = map.keySet(); // map의 key를 담은 객체 keys를 생성 (set은 중복x)후 keys에 저장
			for(Integer n : keys) // keys의 요소(int)를 순회후 int n에 저장.
				out.println(map.get(n)); // 가져온 값을 출력.
			
			/*
				Berlin
				Dortmund
				Frankfurt
				Gelsenkirchen
				Hamburg
			*/
	}

}

List

List는 순서가 있는 데이터의 집합으로, 데이터를 중복으로 포함할 수 있습니다. 

데이터를 인덱스를 사용하여 접근하고, 순서를 유지합니다.

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

public class ListExample {
    public static void main(String[] args) {
        List<String> fruits = new ArrayList<>();
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Orange");
        fruits.add("Apple"); // 중복된 데이터

        System.out.println(fruits); // 출력: [Apple, Banana, Orange, Apple]
    }
}

Set

Set은 순서가 없는 고유한 데이터의 집합으로, 중복된 데이터를 포함할 수 없습니다.

import java.util.HashSet;
import java.util.Set;

public class SetExample {
    public static void main(String[] args) {
        Set<String> countries = new HashSet<>();
        countries.add("USA");
        countries.add("Canada");
        countries.add("India");
        countries.add("Canada"); // 중복된 데이터

        System.out.println(countries); // 출력: [USA, Canada, India]
    }
}

Map

Map은 키와 값의 쌍으로 데이터를 저장하는 구조입니다. 

각각의 키는 고유해야 하며, 키를 사용하여 값에 접근할 수 있습니다.

import java.util.HashMap;
import java.util.Map;

public class MapExample {
    public static void main(String[] args) {
        Map<String, Integer> studentScores = new HashMap<>();
        studentScores.put("John", 85);
        studentScores.put("Alice", 92);
        studentScores.put("Bob", 78);

        int johnScore = studentScores.get("John");
        System.out.println("John's score: " + johnScore); // 출력: John's score: 85
    }
}

ArrayList

ArrayList는 크기가 가변적인 동적 배열을 구현한 클래스로,

내부적으로 배열을 사용하여 요소를 저장합니다.

요소의 삽입, 삭제, 검색 등의 작업에 효율적이며, 임의의 인덱스로 접근할 수 있습니다.

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

public class ArrayListExample {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("Alice");
        names.add("Bob");
        names.add("Charlie");

        System.out.println(names); // 출력: [Alice, Bob, Charlie]

        String secondName = names.get(1);
        System.out.println("Second name: " + secondName); // 출력: Second name: Bob

        names.remove(0);
        System.out.println(names); // 출력: [Bob, Charlie]
    }
}

Vector

Vector는 ArrayList와 유사한 기능을 제공하는 클래스로, 동적 배열을 구현합니다.

Vector는 스레드 동기화를 지원하므로 멀티스레드 환경에서 안전하게 사용할 수 있습니다.

import java.util.Vector;
import java.util.List;

public class VectorExample {
    public static void main(String[] args) {
        List<Integer> numbers = new Vector<>();
        numbers.add(10);
        numbers.add(20);
        numbers.add(30);

        System.out.println(numbers); // 출력: [10, 20, 30]

        int firstNumber = numbers.get(0);
        System.out.println("First number: " + firstNumber); // 출력: First number: 10

        numbers.remove(2);
        System.out.println(numbers); // 출력: [10, 20]
    }
}

LinkedList

LinkedList는 이중 연결 리스트(doubly linked list)를 구현한 클래스로, 

각 요소가 이전 요소와 다음 요소에 대한 참조를 유지합니다. 

요소의 삽입, 삭제, 검색 작업에서 유연하게 동작할 수 있습니다. 

그러나 임의의 인덱스로의 접근은 ArrayList나 Vector보다 느리게 될 수 있습니다.

import java.util.LinkedList;
import java.util.List;

public class LinkedListExample {
    public static void main(String[] args) {
        List<String> colors = new LinkedList<>();
        colors.add("Red");
        colors.add("Green");
        colors.add("Blue");

        System.out.println(colors); // 출력: [Red, Green, Blue]

        String lastColor = colors.get(colors.size() - 1);
        System.out.println("Last color: " + lastColor); // 출력: Last color: Blue

        colors.remove(1);
        System.out.println(colors); // 출력: [Red, Blue]
    }
}

HashSet

HashSet은 순서를 유지하지 않는 고유한 요소들의 집합을 나타내는 클래스입니다. 

중복된 요소를 허용하지 않으며해시 함수를 사용하여 요소들을 저장하고 검색합니다.

import java.util.HashSet;
import java.util.Set;

public class HashSetExample {
    public static void main(String[] args) {
        Set<String> fruits = new HashSet<>();
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Orange");
        fruits.add("Apple"); // 중복된 요소

        System.out.println(fruits); // 출력: [Apple, Orange, Banana]
    }
}

TreeSet

TreeSet은 순서가 정렬된 고유한 요소들의 집합을 나타내는 클래스입니다. 

요소들은 기본 정렬 순서 또는 사용자가 지정한 정렬 순서에 따라 정렬됩니다.

import java.util.TreeSet;
import java.util.Set;

public class TreeSetExample {
    public static void main(String[] args) {
        Set<Integer> numbers = new TreeSet<>();
        numbers.add(5);
        numbers.add(2);
        numbers.add(8);
        numbers.add(2); // 중복된 요소

        System.out.println(numbers); // 출력: [2, 5, 8]
    }
}

HashMap

HashMap은 키-값 쌍으로 데이터를 저장하는 클래스입니다. 

키와 값은 모두 중복을 허용하지 않으며, 해시 함수를 사용하여 데이터를 저장하고 검색합니다.

import java.util.HashMap;
import java.util.Map;

public class HashMapExample {
    public static void main(String[] args) {
        Map<String, Integer> studentScores = new HashMap<>();
        studentScores.put("John", 85);
        studentScores.put("Alice", 92);
        studentScores.put("Bob", 78);

        int johnScore = studentScores.get("John");
        System.out.println("John's score: " + johnScore); // 출력: John's score: 85
    }
}

Hashtable

HashtableHashMap과 비슷한 키-값 쌍을 저장하는 클래스입니다.

Hashtable스레드 동기화를 지원하여 멀티스레드 환경에서 안전하게 사용할 수 있습니다.

다만, HashMap에 비해 성능 면에서는 약간 떨어질 수 있습니다.

import java.util.Hashtable;
import java.util.Map;

public class HashtableExample {
    public static void main(String[] args) {
        Map<String, Integer> studentScores = new Hashtable<>();
        studentScores.put("John", 85);
        studentScores.put("Alice", 92);
        studentScores.put("Bob", 78);

        int johnScore = studentScores.get("John");
        System.out.println("John's score: " + johnScore); // 출력: John's score: 85
    }
}

TreeMap

TreeMap은 키-값 쌍을 정렬된 순서로 저장하는 클래스입니다. 

기본 정렬 순서 또는 사용자가 지정한 정렬 순서에 따라 정렬됩니다.

import java.util.TreeMap;
import java.util.Map;

public class TreeMapExample {
    public static void main(String[] args) {
        Map<Integer, String> students = new TreeMap<>();
        students.put(3, "Alice");
        students.put(1, "Bob");
        students.put(2, "John");

        System.out.println(students); // 출력: {1=Bob, 2=John, 3=Alice}
    }
}

Properties

Properties는 키와 값이 모두 String 타입인 설정 정보를 저장하는 클래스입니다. 

일반적으로 설정 파일이나 구성 파일을 처리하는 데 사용됩니다.

import java.util.Properties;

public class PropertiesExample {
    public static void main(String[] args) {
        Properties properties = new Properties();
        properties.setProperty("name", "John");
        properties.setProperty("age", "25");

        String name = properties.getProperty("name");
        String age = properties.getProperty("age");

        System.out.println("Name: " + name); // 출력: Name: John
        System.out.println("Age: " + age); // 출력: Age: 25
    }
}

Stack

스택은 후입선출(LIFO, Last-In-First-Out) 원칙을 따르는 자료구조로, 

마지막에 삽입된 요소가 가장 먼저 제거됩니다. 삽입과 제거가 스택의 상단(top)에서 이루어집니다.

import java.util.Stack;

public class StackExample {
    public static void main(String[] args) {
        Stack<String> stack = new Stack<>();
        stack.push("Apple");
        stack.push("Banana");
        stack.push("Orange");

        System.out.println(stack); // 출력: [Apple, Banana, Orange]

        String top = stack.pop();
        System.out.println("Removed: " + top); // 출력: Removed: Orange

        String peek = stack.peek();
        System.out.println("Top: " + peek); // 출력: Top: Banana
    }
}

queue

큐는 선입선출(FIFO, First-In-First-Out) 원칙을 따르는 자료구조로, 

가장 먼저 삽입된 요소가 가장 먼저 제거됩니다. 삽입은 큐의 뒤(rear)에서, 제거는 큐의 앞(front)에서 이루어집니다.

import java.util.Queue;
import java.util.LinkedList;

public class QueueExample {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();
        queue.offer("Apple");
        queue.offer("Banana");
        queue.offer("Orange");

        System.out.println(queue); // 출력: [Apple, Banana, Orange]

        String front = queue.poll();
        System.out.println("Removed: " + front); // 출력: Removed: Apple

        String peek = queue.peek();
        System.out.println("Front: " + peek); // 출력: Front: Banana
    }
}

'Studying > JAVA' 카테고리의 다른 글

JAVA 최댓값 최소값 쉽게 구하기  (7) 2023.07.17
Day08 JAVA Studying  (0) 2023.07.14
Day06 JAVA Studying  (1) 2023.07.10
Day05 JAVA Studying  (0) 2023.07.07
Day04 JAVA Studying  (0) 2023.07.06

블로그의 정보

감성 개발자 효기

효기’s

활동하기