memostack
article thumbnail
Java - Collection과 Map의 종류(List, Set, Map)
Language/JAVA 2021. 3. 9. 22:21

Collection과 Map Java의 자료구조는 크게 Collection과 Map으로 나눌 수 있음 그리고, Collection은 List와 Set, Queue로 나눌 수 있음 본 글에서는 아래 자료구조에 대한 내용을 간단히 정리한다. List: ArrayList, LinkedList, Vector, Stack Set: HashSet, LinkedHashSet, TreeSet Queue: priorityQueue, ArrayDeque Map: HashMap, LinkedHashMap, Hashtable, TreeMap Collection - List 리스트는 순서를 가지고, 원소의 중복이 허용된다는 특징이 있음 ArrayList ArrayList는 배열을 이용하여 만든 리스트이다. 기본 크기는 10이지..

article thumbnail
Java - HashMap과 Hashtable의 차이
Language/JAVA 2021. 3. 8. 18:27

HashMap과 Hashtable 모두 map 자료구조다. 사용 방법도 거의 동일하지만, 차이점이 있음 // HashMap Map map = new HashMap(); map.put(1, "one"); map.put(2, "two"); System.out.println(map.get(1)); // one System.out.println(map.get(2)); // two // Hashtable Map table = new Hashtable(); table.put(1, "one"); table.put(2, "two"); System.out.println(table.get(1)); // one System.out.println(table.get(2)); // two HashMap HashMap은 동기화를 ..

article thumbnail
Java - equals()와 hashCode()의 관계
Language/JAVA 2021. 3. 7. 16:57

Object의 equals()와 hashCode() equals() equals()는 보통 동일한 객체인지 확인할 때 사용한다. 항상 그런것은 아님 String의 경우는 문자열이 동일한지 확인할 때 사용 // Object의 equals() public boolean equals(Object obj) { return (this == obj); } hashCode() native 언어로 작성된 메소드로 구체적인 내부 구현부는 확인하기 어렵지만, 객체의 해시 값을 반환한다고 주석에 명시 되어 있음 즉, 객체의 해시 값을 int 타입으로 반환함 HashTable, HashMap, HashSet 등 Hash를 이용해서 데이터를 저장하는 자료구조에 이점을 줌 데이터 저장 위치를 결정하는데 사용됨 /** * Retu..

article thumbnail
Java - String Pool에 대해서
Language/JAVA 2021. 3. 7. 15:49

String Pool String을 이용하여 문자열을 생성하는 방법은 2가지가 있다. 문자열 리터럴을 이용하여 생성 new 연산자를 통해 String 객체를 생성하는 방법 위 2개 방법 모두 Heap 영역에 데이터가 저장되는것은 동일하지만, 리터럴의 경우는 String Pool 이라는 곳에 생성된다. 리터럴 방식으로 문자열을 생성할 때, 만약 String Pool에 같은 문자열이 존재하면 새로 만들지 않고, 만들어진 문자열을 바라본다. 그래서, 아래와 같이 같은 문자열인 경우 동일한 주소를 바라보고 있다. String greet = "Hello"; String greet2 = "Hello"; System.out.println(System.identityHashCode(greet)); System.out...

article thumbnail
Java의 String과 StringBuilder, StringBuffer 비교
Language/JAVA 2021. 3. 7. 15:46

String String은 불변성(Imutable)을 가진 객체로 + 연산자를 통해 문자열을 생성하는 경우, 새로운 문자열을 반환한다. String greet = "Hello"; System.out.println(greet.hashCode()); greet += " World"; System.out.println(greet.hashCode()); 69609650 -862545276 + 연산 후 주소값이 달라짐. 즉, 가리키는 문자열이 달라짐 StringBuilder & StringBuffer StringBuilder와 StringBuffer는 String에 문자열을 추가하면 새로운 객체를 반환하는 단점을 보완하여 만들어진 클래스이다. StringBuilder와 StringBuffer는 버퍼(Buffer)..

article thumbnail
JVM GC 동작 순서와 GC 종류(Serial / Parallel / CMS / G1 GC )
Language/JAVA 2021. 3. 7. 14:46

JVM GC 동작 순서 요약하면 GC 동작은 아래 3 STEP으로 나눠진다. Heap 영역에 존재하는 객체들에 대해 접근 가능한지 확인한다. GC Root에서 부터 시작하여 참조값을 따라가며 접근 가능한 객체들에 Mark하는 과정을 진행한다. Mark 되지 않은 객체 즉, 접근할 수 없는 객체는 제거(Sweep) 대상이 된고, 해당 객체들을 제거한다. 접근 가능한 객체 판단 과정 GC Root에서 시작해서 참조하는 객체를 찾고, 또 그 객체가 참조하는 객체를 찾아가며 Mark 한다. (아래 그림 참고) Mark 되지 않은 객체는 접근할 수 없는 객체 (Unreachable Object)로 판단하고 메모리를 돌며 제거(Sweep)한다. GC Root가 될 수 있는 대상 JVM 메모리의 Stack 영역에 존..

article thumbnail
JVM GC(Garbage Collector) 구조
Language/JAVA 2021. 3. 7. 13:28

GC (Garbage Collector) JVM에는 메모리를 자동으로 관리해주는 특징이 있는데, 이 역할을 Garbage Collector(가비지 콜렉터)이 한다. 정확히는 JVM 메모리 중 Heap 영역에서 사용하지 않는 객체를 삭제하여 관리해줌 Stop The World GC에는 stop-the-world 라는 것이 존재하여, 메모리가 관리되는 동안 Java Application이 멈추는 현상을 말한다. stop-the-world가 발생하는 동안 GC 스레드를 제외한 모든 스레드가 멈춤 stop-the-world가 발생하는 시간이 줄이기 위해 JVM 튜닝을 하곤하는데, 튜닝을 위해서는 JVM GC에 대해 살펴볼 필요가 있다. 일반적인 GC 구조 일반적인 GC 구조는 Young Generation과 O..

article thumbnail
JVM 메모리 (Runtime Data Area)
Language/JAVA 2021. 3. 7. 01:36

Runtime Data Area JVM 메모리를 뜻함 Runtime Data Area는 5개 영역으로 나눠짐 Method Area, Heap, Stack, PC Register, Native Method Area Method Area와 Heap은 모든 스레드가 공유하는 공간 Stack, PC Register, Native Method Area는 각각의 스레드가 하나씩 가지는 공간 Method Area (메소드 영역) class data와 static 변수가 저장되는 공간 모든 스레드(Thread)가 공유하는 공간 JVM이 실행될때 생성됨 Heap (힙 영역) new 를 통해 동적으로 생성되는 객체가 저장되는 공간 (또는 배열) Heap에 저장된 데이터는 메모리 관리가 필요한 GC 대상 만약 참조하지 않는..

article thumbnail
JVM과 JVM 아키텍처 (Class Loader, Runtime Data Area, Execution Engine)
Language/JAVA 2021. 3. 7. 00:51

JVM Java Virtual Machine의 약자. Java 프로그램이 플랫폼에 의존하지 않고, 어디서든 동작 가능하도록 하기 위한 Java 가상 머신이다. 단, Java 프로그램은 JVM 위에서 동작하기 때문에, JVM에 의존성을 가짐 C/C++ 언어는 CPU 아키텍처, 운영체제 등 플랫폼 환경에 의존성을 가지기 때문에, 플랫폼이 바뀌면 제대로 동작하지 않는 문제가 있음 (크로스 컴파일을 통해, 타겟 플랫폼에 맞춰서 컴파일을 해줘야 함) Java의 경우 이러한 문제를 해결하기 위해 JVM을 만들었음 JVM 아키텍처 JVM은 아래와 같이 크게 Class Loader, Runtime Data Area(JVM 메모리), Execution Engine 으로 나눠짐 Class Loader Java 바이트 코드..

article thumbnail
Java - 연산자의 종류 (증감/부호/산술/논리/비교/대입 연산자)
Language/JAVA 2021. 2. 3. 23:18

산술 연산자 +, -, *, /, %로 더하기, 빼기, 곱하기, 나누기, 나머지 몫 연산자로 나눠진다. 우리가 아는 사칙연산을 생각하면 된다. +: 더하기 -: 빼기 *: 곱하기 /: 나누기 %: 나눈 후 나머지 몫 int num = 15; System.out.println(num + 2); // 17 System.out.println(num - 2); // 3 System.out.println(num * 2); // 30 System.out.println(num / 2); // 7.5 System.out.println(num % 4); // 15/4 의 나머지는 3 17 13 30 7 3 증감 연산자 ++: 항에 1을 더한다. --: 항에 1을 뺀다. 증가/감소 연산자 위치에 따라 다른 의미를 가지는데..

article thumbnail
Java - 형 변환 (Type Conversion)
Language/JAVA 2021. 2. 3. 22:38

형 변환 변수와 값이 서로 다른 자료형의 값을 가지는 경우, 형 변환이 발생함 형 변환에는 2가지가 있다 묵시적 형 변환 Implicit type conversion 명시적 형 변환 Explicit type conversion 묵시적 형 변환 Implicit type conversion 프로그래머가 따로 명시할 필요 없이 알아서 형 변환이 일어난다. 하지만, 아래와 같은 조건이 존재한다. 1. 작은 수에서 큰 수로 형 변환이 일어남 (예시) short (2byte) -> int (4byte) int (4byte) -> long (8byte) // 작은 수에서 큰 수로 형 변환 byte byteNum = 1; int intNum = byteNum; // 형 변환 발생 System.out.println(by..

article thumbnail
Java - 상수와 리터럴 (Constant & Literal)
Language/JAVA 2021. 2. 3. 22:16

상수 (Constant) 변하지 않고 고정된 값 오해할 수 있는 게 반드시 숫자일 필요는 없다. 숫자, 문자, 문자열 등 값이 변하지 않는다면 모두 상수 final int NUM = 1; // 정수형 상수 final double PI = 3.14; // 실수형 상수 final String NAME = "홍길동"; // 문자열 상수 Java에서는 상수를 사용할 때 final 키워드를 사용한다. final 키워드로 선언된 변수는 재할당이 불가능하여, 만약 재할당을 하는 경우 컴파일 오류가 발생한다. final int NUM = 1; NUM = 10; // 컴파일 오류 암묵적으로 상수를 표현할때는 대문자로 표현한다. (띄어 쓰기는 _ 를 사용하여 구분한다) 리터럴 (Literal) 프로그램에서 사용하는 변하지..

article thumbnail
Java - 자바의 자료형 Data Type (Primitive Type, Reference Type)
Language/JAVA 2021. 2. 2. 21:03

자바의 자료형 Java의 자료형에는 기본형(Primitive Type), 참조형(Reference Type) 2가지가 존재한다. 자료형은 다른 말로 Data Type이라 부르기도 함 기본형 Primitive Type 자바에서 기본적으로 제공해주는 기본 자료형으로 primitive type이라 함 example: int, double, float, char 등등 기본형 데이터 타입은 변수에 값이 직접 저장되어 스택(stack) 영역에 저장되어 있다 기본 자료형의 종류와 크기 1바이트(btye)는 8비트(bit)이다 public class Main { public static void main(String[] args) { // 정수형 byte bNum = 1; // 1byte short shortNum =..

article thumbnail
Java - 문자 자료형과 아스키코드, 유니코드(UTF-8, UTF-16)
Language/JAVA 2021. 2. 2. 20:59

char 문자 자료형 char 타입은 데이터를 저장할 때 비트의 조합으로 저장이 된다. 문자에는 각각 코드 값이 부여되어 있다. 예를 들어서, A는 65, B는 66... 아스키코드와 유니코드 문자를 표현할 때 아스키코드와 유니코드를 사용한다. 아스키(ASCII) 코드 1바이트(8bit)로 영문자, 숫자, 특수문자 등을 표현함 유니코드 영문자, 숫자, 특수문자 뿐만 아니라 한글, 한자와 같이 복잡한 언어를 표현한다. 대표적으로는 UTF-8, UTF-16이 있다 public class Main { public static void main(String[] args) { // 아스키 코드 & 유니코드 System.out.println((char) 65); // A (아스키코드) System.out.print..

article thumbnail
Java - 변수 선언 및 변수 명명 규칙
Language/JAVA 2021. 2. 2. 20:15

변수 고정되어 있지 않고, 변할 수 있는 수를 뜻 함 프로그래밍에서도 마찬가지로 정해지지 않은 값으로 사용됨 실행 도중에 계속해서 바뀔 수 있음 또한 변수는 데이터를 저장하기 위해 사용됨 변수 선언 및 값 할당 Java에서는 변수의 자료형에 맞는 타입을 사용해야 함 타입 변수; 또는 타입 변수 = 값; 과 같은 형태로 선언 public class Main { public static void main(String[] args) { // 1. 변수 선언 int number; // 변수 선언 number = 1; // 변수에 값 할당 System.out.println(number); // 2. 변수 선언 & 값 할당 int age = 29; System.out.println(age); // 3. 동시에 여러..

article thumbnail
Java - Hello World 콘솔에 출력하기
Language/JAVA 2021. 2. 2. 19:48

콘솔 출력하기 Java에서는 콘솔을 출력할 때 System.out.println() 메소드를 사용한다. 문자열을 표현할 때는 쌍 따옴표("")를 사용한다. 코드의 맨 마지막에는 세미콜론(;)을 사용한다. public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } } 윈도우 인텔리제이 기준으로 Ctrl + Shift + F10을 누르면 실행된다. 맥 인텔리제이는 command + Shift + r을 누르면 실행됨 자바의 실행 순서 1. 프로그래머가 코드를 작성한다. 2. 컴파일한다. (컴파일을 하면, 바이트코드가 생성됨, HelloWorld.java -> HelloWorld.c..

Mac OS에서 JDK 11 설치 (adoptopenjdk11)
Language/JAVA 2020. 10. 30. 23:02

Homebrew를 사용하면, openjdk를 설치하는 건 굉장히 쉽다. jdk 뿐만 아니라 다른 패키지 설치하거나 삭제할때도 매우 편리함 JDK 11 설치 (adoptopenjdk11) 본 글에서는 adoptopenjdk11을 설치한다. $ brew cask install adoptopenjdk11 ==> Downloading https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.9%2B11.1/OpenJDK11U-jdk_x64_mac_hotspot_11.0.9_11.pkg ...중략... install-time: 1604066415 🍺 adoptopenjdk11 was successfully installed! 설치 ..

article thumbnail
Java 파일 존재 여부, 파일 또는 디렉토리 확인하기
Language/JAVA 2020. 10. 17. 18:28

파일이 존재하는지 확인 Java에서 파일이 존재하는지 확인하기 위해서는 File 오브젝트의 exists() 메소드를 사용한다. import java.io.File; public class App { public static void main( String[] args ) { // 파일의 경로 final File driverFile = new File("src/resources/bin/chromedriver.exe"); final String driverFilePath = driverFile.getAbsolutePath(); // 파일이 존재하는지 확인 if(!driverFile.exists()) { // 파일이 존재하지 않는다면, 오류 발생. throw new RuntimeException("Not fo..

article thumbnail
Java와 Selenium을 이용하여 웹 크롤러 만들기
Language/JAVA 2020. 10. 17. 18:19

목표 Java와 Selenium을 가지고 웹 크롤러를 만든다. 환경 Maven 기반의 Java 프로젝트 Java 버전 OpenJDK 1.8.0_242 Selenium 라이브러리 편의를 위해 Maven 프로젝트로 생성했다. Selenium 라이브러리를 가져온다. mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java Maven Repository: org.seleniumhq.selenium » selenium-java Selenium automates browsers. That's it! What you do with that power is entirely up to you. VersionRepositoryUsagesDate4.0.x4.0.0-..

article thumbnail
Maven으로 Java 프로젝트 생성하기
Language/JAVA 2020. 9. 11. 19:05

Maven 설치 본 글에서는 MacOS 환경에서 Maven을 설치하고, Homebrew를 이용한다. # MacOSX brew install maven 설치 완료 후 버전 확인 $ mvn --version Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: /usr/local/Cellar/maven/3.6.3_1/libexec Java version: 14.0.1, vendor: N/A, runtime: /usr/local/Cellar/openjdk/14.0.1/libexec/openjdk.jdk/Contents/Home Default locale: ko_KR, platform encoding: UTF-8 OS name: "m..