Set 컬렉션은 저장 순서가 유지되지 않으며, 객체의 중복 저장이 불가능합니다.

구현 클래스는 'HashSet', 'LinkedHashSet', 'TreeSet'이 있습니다.

 


Set 컬렉션에서 사용되는 주요 메서드는 다음과 같습니다.

 

 

  • boolean add(E e) : 주어진 객체를 저장하고 저장이 성공하면 ture, 아니면 false를 리턴

  • boolean contains(Object o) : 주어진 객체가 저장되어 있는지 여부
  • isEmpty() : 컬렉션이 비어있는지 조사
  • Iterator <E> iterator() : 저장된 객체를 한번씩 가져오는 반복자 리턴
  • int size() : 저장되어 있는 전체 객체 수 리턴

  • void clear() : 저장된 모든 객체를 삭제
  • boolean remove(Object o) : 주어진 객체를 삭제

 


 


 

해쉬 셋( HashSet )

HashSet은 동일 객체나 동등 객체는 중복 저장하지 않습니다.

해쉬코드는 논리적인 주소가 동일하게 나올 수 있기 때문에, 해쉬코드가 동일하다면 재정의한 eqauls() 메서드를 통해 비교합니다.

 

@Log4j2
@AllArgsConstructor
public class Member {
    public String name;
    public Integer age;
	
	
    // 중복 판정을 위해서 Override(재정의)
    @Override
    public boolean equals(Object obj) {
        log.trace("equals({}) invoked.", obj);
		 
        if(obj instanceof Member member) {
            // Member member = (Member) obj;
            return member.name.equals(name) && (member.age == age);
        } else {
            return false;
        } // if-else
		
    } // equals 
	
    @Override
    public int hashCode() {
        log.trace("hashCode({}) invoked.");
        return name.hashCode() + age;
    } // hashCode
	
} // end class

 

해쉬코드는 동일할 수 있기 때문에,동일 객체의 여부를 판단할 수 있는 알고리즘을 가지고 메서드를 오버라이드해야 합니다.

 

 

다음은 실행클래스입니다.

 

@Log4j2
public class HashSetExample {
	

    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
		
        // 요소 객체 추가
        set.add("Java");
        set.add("JDBC");
        set.add("Servlet/JSP");
        set.add("Java");
        set.add("iBATIS");
		
        // 객체의 크기 반환
        int size = set.size();
        log.info("총 객체 수 : {}", size);
		
        // 객체들을 순회(Traverse)
        // Iterator<E> 객체를 필요로 한다
        Iterator<String> iterator = set.iterator(); // ---- 1
        while(iterator.hasNext()) {                 // ---- 2
            String element = iterator.next();       // ---- 3
            log.info("element : {}", element);
        } // while
		
        System.out.println(); // 개행
		
        // ------------------------------------------
		
        // 두 번째 방법 - Enhanced for
        for(String element : set) {
            log.info("element : {}", element);
        } // Enhanced for
		
		
        // 세 번째 방법 - forEach(Consume<E>) 메서드로 순회
        set.forEach(log::info);
		
        // ·
        // ·
        // ·
        // ·
		
    } // main

} // end class

 

위 코드처럼, 다양한 순회 방법이 있습니다.

만약, HashSet에 같은 필드 정보의 2개의 객체가 add() 메서드로 추가된다면

첫 번째 객체만 추가되고, 두 번째로 add 시도되는 객체는 추가되지 않습니다.

 

 

 

목적에 맞게 컬렉션을 다 사용한 후에는, 반드시 GC가 빠르게 될 수 있도록 clear 해야 합니다.

 

        // List, Set, Map 모두 추가/삭제/변경시에, 중복 판정 알고리즘을 통해 
        // 추가/삭제/변경 가능한 존재한 요소 객체인지 알 수 있음
        set.remove("JDBC");
        set.remove("iBATIS");
		
        log.info("총 객체 수 : {}", set.size());
		
        for(String element : set) {
			log.info("\t{}", element);
        } // enhanced for
		
        // 컬렉션의 모든 요소를 clear 시킴
        set.clear();
		
        // 확인
        if(set.isEmpty()) {
            log.info("비어 있음");
        } // if
        
    } // main
    
} // end class

 

Lombok으로 더 간단하게 코드를 구성할 수 있습니다.

 

       @Cleanup("clear")
       
        // ·
        // ·
        // ·
        // ·
        
        
        
        // List, Set, Map 모두 추가/삭제/변경시에, 중복 판정 알고리즘을 통해 
        // 추가/삭제/변경 가능한 존재한 요소 객체인지 알 수 있음
        set.remove("JDBC");
        set.remove("iBATIS");
		
        log.info("총 객체 수 : {}", set.size());
		
        log.info(set)
        // log.info(set)으로 대체
        // for(String element : set) {
		//	log.info("\t{}", element);
        // } // enhanced for
		
        // 컬렉션의 모든 요소를 clear 시킴
        // set.clear(); // @Cleanup("clear") annotation으로 대체
		
        // 확인
        if(set.isEmpty()) {
            log.info("비어 있음");
        } // if
        
    } // main
    
} // end class

 

위의 코드처럼 Lombok의 어노테이션을 이용하면 간결하고 가독성 좋은 코드를 구성할 수 있습니다.

 

 

 

 

'Java > Collection Framework' 카테고리의 다른 글

트리 컬렉션  (0) 2023.08.04
맵 컬렉션  (0) 2023.08.03
리스트 컬렉션  (0) 2023.08.02
컬렉션 프레임워크 개요  (0) 2023.08.02

 

 

 

Oracle Database Exterprise Edition

 

Database Software Downloads | Oracle

Run the Oracle Database Enterprise Edition Container Image with Docker Contains Oracle Database Enterprise Edition 21c running on Oracle Linux 7. Ideal for macOS, Linux, and other platforms. Use the following pull command for the latest: docker pull contai

www.oracle.com

 

 

 

Oracle SQL Developer

 

Oracle SQL Developer Downloads

This archive. will work on a 32 or 64 bit Windows OS. The bit level of the JDK you install will determine if it runs as a 32 or 64 bit application. This download does not include the required Oracle Java JDK. You will need to install it if it's not already

www.oracle.com

 

'개발자 환경설정 > Oracle' 카테고리의 다른 글

오라클 서버 접속  (0) 2023.08.03
오라클 인스턴스 클라이언트 및 명령줄 설치  (0) 2023.08.03
4. SQLcl 설치  (0) 2023.08.02
3. 오라클 설치 확인  (0) 2023.08.02
2. 오라클 데이터베이스 생성  (0) 2023.08.02

 

 

SQLcl은 쿼리를 실행하고 DB와 상호작용할 수 있는 도구입니다.

 

 

 

다음의 명령어를 입력해서 설치합니다.

 

scoop install sqlcl

 

설치 후, 환경 변수가 설치되어 있는지 확인해야 합니다.

 

PowerShell 재부팅 후, 다음의 명령어로 Powershell에서 환경변수가 정상적으로 설정되었는지 확인합니다.

 

$env:SQLPATH

 


 

환경변수가 설정이 안돼있다면 다음을 참고합니다.

** SQLPATH 설정하기 **

더보기

 

만약 환경변수가 설정되어 있지 않다면, 다음의 명령어를 입력해서 시스템 속성창을 엽니다.

 

sysdm.cpl

 

환경변수 설정

 

환경변수 설정

 

SQLPATH라는 이름으로 scoop에 설치된 SQLcl의 current주소를 입력합니다.

이후, PowerShell을 재시작하고 환경 변수가 잘 설정되었는지 확인합니다.

다음의 명령어로 SQLPATH를 확인합니다.

$env:SQLPATH

 

 


 

 

login.sql 파일은 DB에 접속했을 때,

접속 프롬포트에 접속 계정 등 일정한 정보를 표시하기 위해 사용됩니다.

이 파일을 다음 주소에 넣습니다.

 

C:\app\scoop\apps\sqlcl\current

 

 

그리고 bin 폴더에 들어가서 sql.exe의 이름을 sqlcl.exe라는 이름으로 변경합니다.

 

move .\sql.exe .\sqlcl.exe

 

 

마지막으로 환경변수에서 사용자 변수의 Path에 설치된 sqlcl의 주소를 넣습니다.

 

C:\app\scoop\apps\sqlcl\current

 

환경변수 설정

 

 

 

 

 

 

 

 

 

작업 관리자에서 오라클이 정상적으로 설치되었는지 확인합니다.

 

 

 

Oracle

 

위의 5가지 프로그램 중에서 OracleOraDB19Home1TNSListenerOracleServiceKOREA만 구동되면 됩니다.

정상적으로 설치된 것을 확인할 수 있습니다.

 

설치폴더는 다음의 주소에서 확인할 수 있습니다.

 

C:\u01\oracle\oradata\전역 데이터베이스 이름

 

 

 

 

 

 

 

 

 

Oracle을 설치했다면 데이터베이스를 생성해야 합니다.

아직 설치하지 않으신 분들은 다음 글을 참조해서 설치해주세요.

2023.08.02 - [개발자 환경설정/오라클] - 오라클 설치

 

 

 

저는 로컬에 생성하였습니다.

 

 

 

오라클 데이터베이스 생성

관리자 권한으로 PowerShell을 실행해주세요.

PowerShell에 'dbca'를 입력하면 데이터베이스 어시스턴트가 동작합니다.

 

dbca

 

 

다음의 과정을 따라 생성합니다.

 

 

1. 데이터베이스 작업

데이터베이스 작업

 

 

 

2. 생성 모드

생성 모드

 

 

 

3. 배치 유형

배치 유형

 

 

 

4. 데이터베이스 식별

데이터베이스 식별

 

전역 데이터베이스(CDB)의 이름과 PDB의 이름은 소문자로 짓습니다.

저는 데이터베이스의 이름은 korea, PDB의 이름은 seoul로 짓겠습니다.

이름에서도 알 수 있듯이, 데이터베이스와 PDB는 계층구조를 갖습니다.

 

즉, CDB는 PDB를 관리하게 됩니다.

 

 

 

5. 저장 영역 옵션

저장 영역 옵션

 

템플릿으로 생성하면 윈도우 탐색기로 볼 수 없으므로, 두 번째 옵션을 선택합니다.

 

 

 

6. 빠른 복구 옵션 선택

빠른 복구 옵션 선택

 

 

 

7. 네트워크 구성

네트워크 구성

 

소프트웨어에서 Listener는 포트 번호를 기반으로 접속을 기다리는 호스트를 의미합니다.

Oracle Listener는 1521번 포트에서 Client의 접속 요청을 기다리게 됩니다.

Listener의 이름은 대문자로 짓습니다.

실무에서는 Listener의 포트 번호는 임의의 포트 번호로 변경해서 서비스합니다.

 

 

 

8. Oracle Database Vault 구성 옵션 선택

Oracle Database Vault 구성 옵션 선택

 

그냥 넘어갑니다.

 

 

 

9. 구성 옵션 지정

** 옵션 별 설정 **

 

자동 공유 메모리 관리를 사용하되, 학습에서는 큰 메모리가 필요없기 때문에

옆 드래그옵션에서 SGA 크기를 756MB가 될 때까지 줄입니다.

PGA(Program Global Area)는 DB 서버에 연결된 세션마다, 할당되는 메모리 영역입니다.

 

 

 

10. 관리 옵션 지정 

관리 옵션 지정

 

 

 

11. 데이터 베이스 사용자 인증서 지정

관리 옵션 지정

 

비밀번호를 입력합니다

 

관리 옵션 지정

 

로컬에 생성하는 데이터베이스의 비밀번호는 권장 표준을 준수하지 않아도 괜찮지만 
클라우드에서는 반드시 지켜야합니다.

 

 

 

12.  데이터베이스 생성 옵션 선택

데이터베이스 생성 옵션 선택

 

 

 

13. 요약

요약

 

 

 

14. 완료

완료
완료

 

위의 화면에서 비밀번호 관리에 들어가시면 Lock된 계정을 확인할 수 있습니다.

 

완료 단계에서 컴퓨터의 환경에 따라 설치가 안될수도 있습니다.

 

 

 

 

 

 

 

 

 

 

 

Oracle은 Oracle Instance와 Databases로 구성되어 있습니다.

Oracle Instance는 Oracle DBMS라고 하며, Databases는 실제 데이터가 저장되는 파일입니다.

여기서 DBMS는 DataBase Management System이라고 합니다.

즉, Oracle DBMS는 Databases를 관리하는 소프트웨어라고 할 수 있습니다.

 

 

지금 설치하는 프로그램은 Oracle DBMS입니다.

 

 

 

Oracle을 설치할 때는 운영체제와 무관하게 아래 폴더에 설치하는 것이 관례입니다.

 

/u01/oracle/product/버전/dbhome/

 

orcale까지가 Base 디렉터리이며, dbhome은 Home 디렉터리입니다.

저는 Oracle19cR3(Oracle sersion 19 Release 3)을 설치하겠습니다.

 

PowerShell에서 다음의 명령어로 디렉터리를 생성합니다.

 

mkdir -p oracle/product/19.3.0/dbhome

 

이후 환경변수 2개를 설정해야 합니다.아래 과정을 참고해서 환경변수를 설정합니다.

 


 

환경 변수 설정

더보기

1. ORACLE_BASE

 

오라클 환경변수 1번

 

변수 이름 : ORACLE_BASE
변수 값 : C:\u01\oracle

 

 

 

2. ORACLE_HOME

 

오라클 환경변수 2번

 

변수 이름 : ORACLE_HOME
변수 값 : C:\u01\oracle\product\19.3.0\dbhome

 


 

 

이후에 Oracle 압축 파일을 dbhome에 풀고, setup.exe 파일을 실행합니다.

 

오라클 설치

 

 

실행하면 cmd가 뜨면서 Oracle Databse 설치 프로그램이 뜨는데 cmd 창은 닫지 마시고 설치 프로그램을 진행합니다.

 


 

오라클 데이터베이스 설치 가이드

앞선 과정에 따라 생략되는 옵션이 있습니다.

화면에 설정된 그대로 진행하며, 설치 프로그램을 진행하기 전에 반드시 환경변수를 먼저 설정하고 하셔야 합니다.

 

 

1. 구성 옵션

구성 옵션

 

 

2. 데이터베이스 설치 옵션

데이터베이스 설치 옵션

 

 

3. 데이터베이스 버전

데이터베이스 버전

 

 

4. Oracle 홈 사용자

Oracle 홈 사용자

 

 

5. 설치 위치

설치 위치

 

 

6. 요약 확인 후 설치

요약 확인 후 설치

 

사진에서 인벤토리 정보가 잘못되었는데, 원래 아래의 주소로 되어야 합니다.

C:\u01\oracle\Inventory

 

저처럼 뜨시면 먼저 환경변수를 설정하시고 설치 프로그램을 처음부터 하시면 됩니다.

 

 

7. 완료

완료

 

 

 

 

 

 

 

 

 

 

List 컬렉션은 인덱스로 관리하고 중복해서 객체 저장이 가능합니다.

구현 클래스는 'ArrayList', 'Vector', 'LinkedList'가 있습니다.

 


 

List 컬렉션에서 사용되는 주요 메서드는 다음과 같습니다.

 

 

  • boolean add(E e) : 주어진 객체를 맨 끝에 추가
  • void add(int index, E element) : 주어진 인덱스에 객체를 추가
  • set(int index, E element) : 주어진 인덱스에 저장된 객체를 주어진 객체로 변경

  • boolean contains(Object o) : 주어진 객체가 저장되어 있는지의 여부
  • get(int index) : 주어진 인덱스에 저장된 객체를 리턴
  • isEmpty() : 컬렉션이 비어 있는지 확인
  • int size() : 저장되어있는 젠체 객체 수를 리턴

  • void clear() : 저장된 모든 객체를 삭제
  • remove(int index) : 주어진 인덱스에 저장된 객체를 삭제
  • boolean remove(Object o) : 주어진 객체를 삭제

 


 


 

1. 어레이리스트( ArrayList )

ArrayList는 순서를 보장하고, 중복을 허용하고, 인덱스 번호로 관리합니다.

 

다음 코드는 객체를 추가하는 방법입니다.

 

@Log4j2
public class ArrayListExample {

	
    // 1. 순서보장
    // 2. 중복 허용
    // 3. 인덱스
    public static void main(String[] args) {
       List<String> list = new ArrayList<>();
		
        // ================================
        // 요소(객체) 추가
        // ================================
		
        list.add("java");           // 컬렉션의 맨 끝에 추가
        list.add("JDBC");
        list.add("Servlet/JSP");
        list.add(2, "Database");    // 지정된 인덱스 번호 위치에 추가
        list.add("iBATIS");
		
    } // main
	
} // end class

 

 

List는 인덱스 배열이기 때문에 대부분의 메서드가 인덱스 기반으로 되어 있습니다.

 

add() 메서드의 소괄호에 데이터 외에 숫자가 들어간다면, 그 숫자는 List의 인덱스 번호입니다.

즉, 인덱스 번호에 데이터를 할당한다는 의미입니다.

 

만약 메서드의 시그니처(선언부)가 궁금하다면 해당 메서드에 마우스를 호버링(hovering, 올려놓기)하면 됩니다.

 

 

메서드 시그니처

 

 

여기서 list 객체를 log.info로 출력해보시면 다음과 같은 내용이 출력됩니다.

 

log.info("list : {}", list);

 

List

 

 

그런데, add() 메서드로 인덱스 번호를 지정하고 데이터를 할당하면,

기존의 데이터들은 뒤로 밀려나게 되고 데이터를 삭제하면 삭제된 데이터의 후순위 데이터는 당겨지게 됩니다.

 

이러한 밀고 당겨지는 현상때문에 빅데이터에서의 List 컬렉션 사용은 지양해야 합니다.

 

 

2. 벡터( Vector )

벡터는 thread-safe하기 때문에 ArrayList보다 많이 사용됩니다.

 

게시판 글에 대한 예제입니다.

먼저 Borad 클래스입니다.

 

@ToString
@AllArgsConstructor
@Getter @Setter
public class Board {
    private String subject;		// 제목
    private String content;		// 내용
    private String writer;		// 작성자
	
	
} // end Board

 

다음은 Board 클래스를 기반으로 한 Vector 실행 클래스 코드입니다.

 

@Log4j2
public class VectorExample {

	
    public static void main(String[] args) {
        List<Board> list = new Vector<Board>();
		
        list.add(new Board("제목1", "내용1", "글쓴이1"));
        list.add(new Board("제목2", "내용2", "글쓴이2"));
        list.add(new Board("제목3", "내용3", "글쓴이3"));
        list.add(new Board("제목4", "내용4", "글쓴이4"));
        list.add(new Board("제목5", "내용5", "글쓴이5"));
		
        list.remove(2);
        list.remove(3);
		
        for(int i = 0; i < list.size(); i++) {
            Board board = list.get(i);

			
            // StringBuffer => Thread - Safe
            String boardLog = 
                    new StringBuffer().
                    append(board.getSubject()).append('\t').
                    append(board.getContent()).append('\t').
                    append(board.getWriter()).
                    toString();
			
            log.info(boardLog);
         } // Classical For
		
        // 남아있는 요소를 가진 컬렉션을 순회(Traverse) #2
        for(Board board : list) {
            log.info(board);
        } // enhanced for
		
        // 남아있는 요소를 가진 컬렉션을 순회(Traverse) #3 
        list.forEach(log::info);
		
    } // main
	
} // end class

 

Vector는 멀티 스레드가 동시에 Vector에 접근해서 객체를 추가, 삭제하더라도 thread-safe합니다.

 

 

3. 링크 리스트( LinkedList )

LinkedList는 thread-unsafe하지만,  ArrayList와 Vector의 요소를 저장하는 구조와 다릅니다.

근처의 참조를 링크해서 체인처럼 관리하고, 특정 인덱스에서 객체를 삭제하거나 추가하게 되면 바로 앞뒤 링크만 재설정합니다.

그렇기 때문에, 실질적인 자리이동이 없습니다.

 

하지만, 다른 레퍼런스를 참조할 때, Vector나 ArrayList 보다 속도가 느리다는 것이 단점입니다.

 

다음은 ArrayList와 LinkedList의 속도 비교입니다.

 

@Log4j2
public class LinkedListExample {
	
	
    public static void main(String[] args) {
        // 1. ArrayList 컬렉션
        List<String> list1 = new ArrayList<String>();
        // 2. LinkedList 컬렉션
        List<String> list2 = new LinkedList<String>();
		
        long startTime;
        long endTime;
		
        startTime = System.nanoTime();
        for(int i = 0; i < 100000; i++) {
            // 미는 현상을 일부러 발생시키기 위해,
            // 리스트의 가장 처음 요소로 무조건 추가
            list1.add(0, String.valueOf(i));
        } // Classical For
		
        endTime = System.nanoTime();
        log.info("ArrayList Elased Time : {}", (endTime - startTime));
		
        // ===========================================================
		
        startTime = System.nanoTime();
		
        for(int i = 0; i < 100000; i++) {
            // 0번 인덱스에 새로운 요소를 추가하지만 미는 현상이 발생 안함
            list2.add(0, String.valueOf(i));
        } // Classical For
		
        endTime = System.nanoTime();
        log.info("ArrayList Elased Time : {}", (endTime - startTime));
        
    } // main
	
} // end class

 

다음은 코드의 결과입니다.

 

LinkedList

 

위의 결과에서도 알 수 있듯이, LinkedList는 ArrayList보다 훨씬 빠른 속도를 보여주고 있습니다.

 

인터페이스의 성질 뿐만 아니라 구현 클래스의 성질과 차이도 잘 알고있어야, 코드를 효율적으로 구축할 수 있습니다.

 

 

 

 

 

 

 

 

'Java > Collection Framework' 카테고리의 다른 글

트리 컬렉션  (0) 2023.08.04
맵 컬렉션  (0) 2023.08.03
셋 컬렉션  (0) 2023.08.03
컬렉션 프레임워크 개요  (0) 2023.08.02

 

 

 

VisualVM은 내가 만든 애플리케이션을 모니터링하고 분석하는데 사용됩니다.

 

 

 

scoop을 통해 설치합니다.

scoop을 설치하지 않으신 분들은 다음 글을 참조해주세요.

 

2023.07.27 - [개발자 환경설정] - 스쿱 설치

 

 


 

 

다음의 명령어를 입력해서 VisualVM을 설치합니다.

 

 

scoop install visualvm

 

 

VisualVM의 실행을 위해 설정파일에서 설치한 jdk의 주소를 직접 입력해야 합니다.

설정파일을 찾기 위해 scoop prefix(주소찾기)를 사용하고 cd 명령어를 이용해 디렉토리로 이동합니다.

 

다음의 명령어를 입력합니다.

 

 

scoop prefix visualvm
cd C:\app\scoop\apps\visualvm\current\etc

 

visualvm

 

 

이동한 디렉터리(etc)에서 visualvm.conf 디렉터리 파일이 있는지 확인하고 subl 명령어로 파일을 엽니다.

subl 명령어를 이용하려면 scoop으로 sublime-text가 설치되어 있어야 합니다.

visual만 입력하고 tab으로 자동완성할 수 있습니다.

 

 

dir 
subl .\visualvm.conf

 

 

visualvm

 

 

설정파일이 열리면 다음과 같은 문장을 찾습니다.

 

 

#visualvm_jdkhome="/path/to/jdk"

 

 

위의 문장에서 scoop 으로 설치한 jdk의 주소를 입력합니다.

 

 

visualvm

 

 

scoop prefix 이나 whitch java로 jdk 주소를 찾고 입력하면 됩니다.

 

 

visualvm

 


 

 

이제 powershell에 다음 명령어를 입력하면 VisualVM이 구동됩니다.

 

 

visualvm

 

visualvm 구동 화면

 

 

이 외에도 오라클에서 제공하는 JMC(Java Mission Control), JIT 컴파일러(Just-In-Time Comfiler) 등이 있습니다.

하나만 사용하셔도 되지만, 각 툴마다의 강점이 있기 때문에 개발 환경에 맞는 툴을 선택해야 합니다.

 

 

+ Recent posts