[java] 컬렉션 프레임워크를 활용한 그래프 구현

소개

그래프는 데이터 요소들 간의 관계를 표현하는 자료 구조입니다. 컬렉션 프레임워크는 자바에서 제공하는 다양한 자료 구조와 알고리즘을 구현하는데 유용한 라이브러리입니다. 이번 글에서는 컬렉션 프레임워크를 활용하여 그래프를 구현하는 방법에 대해 알아보겠습니다.

그래프 구현하기

그래프는 노드(node)와 간선(edge)으로 이루어져 있습니다. 우리는 노드를 나타내는 객체와 간선을 나타내는 객체를 만들어야 합니다. 이러한 객체들을 컬렉션 프레임워크의 List나 Set을 활용하여 관리할 수 있습니다.

자바에서는 그래프를 구현하기 위해 컬렉션 프레임워크의 HashSet을 사용하는 것이 일반적입니다. HashSet은 중복된 요소를 허용하지 않고 순서를 보장하지 않는 Set 인터페이스의 구현입니다. 이를 이용하여 그래프의 노드들을 관리할 수 있습니다.

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

public class Graph {
    private Set<Node> nodes;
    
    public Graph() {
        nodes = new HashSet<>();
    }
    
    public void addNode(Node node) {
        nodes.add(node);
    }
}

위 코드에서는 Graph 클래스를 정의하고, HashSet을 이용하여 노드들을 관리합니다. addNode 메소드를 통해 노드를 추가할 수 있습니다.

노드와 간선 구현하기

그래프를 구성하는 노드와 간선을 나타내는 객체를 정의해야 합니다. 노드는 보통 이름이나 값을 가지고 있고, 간선은 노드들 간의 연결 관계를 나타내는 정보를 지니고 있습니다. 이러한 객체들을 컬렉션 프레임워크의 클래스나 인터페이스를 활용하여 구현할 수 있습니다.

public class Node {
    private String name;
    
    public Node(String name) {
        this.name = name;
    }
    
    // Getters and Setters
}

public class Edge {
    private Node from;
    private Node to;
    
    public Edge(Node from, Node to) {
        this.from = from;
        this.to = to;
    }
    
    // Getters and Setters
}

위 코드에서는 Node 클래스와 Edge 클래스를 정의하였습니다. Node 클래스는 이름을 가지는 노드를 표현하며, Edge 클래스는 시작 노드와 도착 노드를 표현합니다. 각 클래스에는 필요한 속성과 메소드를 추가하면 됩니다.

활용 예제

이제 그래프를 구현했으므로 실제로 활용해보겠습니다. 예를 들어, 다음과 같은 그래프를 구성해보겠습니다.

A -> B
^    |
|    v
C <- D
public class Main {
    public static void main(String[] args) {
        Graph graph = new Graph();
        
        Node nodeA = new Node("A");
        Node nodeB = new Node("B");
        Node nodeC = new Node("C");
        Node nodeD = new Node("D");
        
        graph.addNode(nodeA);
        graph.addNode(nodeB);
        graph.addNode(nodeC);
        graph.addNode(nodeD);
        
        Edge edgeAB = new Edge(nodeA, nodeB);
        Edge edgeAD = new Edge(nodeA, nodeD);
        Edge edgeBD = new Edge(nodeB, nodeD);
        Edge edgeDC = new Edge(nodeD, nodeC);
        
        // 간선을 추가하는 코드를 작성해주세요.
        
        System.out.println("Graph nodes: " + graph.getNodes());
        System.out.println("Graph edges: " + graph.getEdges());
    }
}

위 코드에서는 Graph 객체에 노드와 간선을 추가하여 그래프를 구성하였습니다. 추가된 노드와 간선들을 출력해보면 다음과 같은 결과를 얻을 수 있을 것입니다.

Graph nodes: [A, B, C, D]
Graph edges: [(A -> B), (A -> D), (B -> D), (D -> C)]

마무리

이번 글에서는 컬렉션 프레임워크를 활용하여 그래프를 구현하는 방법을 알아보았습니다. 컬렉션 프레임워크의 HashSet을 이용하면 그래프를 간편하게 관리할 수 있습니다. 그래프를 활용하는 다른 알고리즘을 구현할 때도 컬렉션 프레임워크를 적극적으로 활용하여 효율적인 코드를 작성해보시기 바랍니다.