JAVA 17

JVM의 메모리 구조

cv(class variable) : 클래스 변수 lv(local variable) : 지역 변수 iv(instance variable) : 인스턴스 변수 1. Method Area(메소드 영역) - 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스 파일(*.class)을 읽고 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. 이 때, 그 클래스의 클래스변수(class variable)도 이 영역에 함께 생성된다. 2. Heap (힙) - 인스턴스가 생성되는 공간. 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 즉, 인스턴스 변수(instance variable)들이 생성되는 공간이다. 3. 호출 스택(call stack 또는 execution stac..

JAVA 2022.07.13

if-else 과 switch 어느 것이 효율적일까?

갑자기 분기 코드를 짤 때 if-else 를 쓰는 것이 더 경제적일지, switch 문을 작성하는 것이 경제적일지 궁금해서 찾아본 결과, 결론부터 말하자면 분기의 수가 많다면(약 5개 이상?) switch 문으로 작성하는 것이 더 낫다고 한다. 그 이유는 switch 문으로 분기의 수가 많다면( 약 5개 이상? 정확한 숫자는 모르겠다. 글마다 조금씩 다름) 컴파일러가 branch table(또는 jump table)을 빌드하여 수행 속도가 더 빠르다고 한다. 분기의 수가 적다면 딱히 차이는 나지 않지만, 수가 많아질수록 성능 차이가 발생할 수 있다고 한다. * 문자열 비교에서의 switch 문 문자열을 다루는 일이 생각보다 많다보니, swtich 문을 적용할 일이 생겼는데 이러한 상황에 고려해야하는 것들..

JAVA 2022.02.25

JAVA 정규식 표현과 정규식

* 정규식이란? 정규식(regular expression: regex)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. * JAVA 정규식의 사용 정규식은 java.util.regex의 Pattern 과 Matcher 클래스를 주로 이용한다. Pattern은 말 그대로 어떤 문자열에서 찾을 패턴을 뜻한다. 문자열(String)의 정규식은 먼저 Pattern 인스턴스로 컴파일 되어야 한다. 그런 다음 Matcher를 이용, 일치하는 개체를 만들 수 있다. 일반적인 호출 순서는 다음과 같다. Pattern p = Pattern.compile("a*b"); // a와 b 사이에 문자가 있을 수도 없을 수도? Matcher m = p.matcher("aaaaab"); Matcher m..

JAVA 2022.02.23

Exception (예외)

Exceptions (예외) Exception은 프로그램의 실행 중에 발생하는 기대하지 않았던 이벤트. 프로그램의 정상적 실행을 방해한다. exception이 발생하는 원인은 다양하다: 코드 에러 잘못된 입력 유효하지 않은 파일 접근 네트워크 연결 오류 물리적인 제한 (디스크 메모리의 부족) exception(예외)는 처리가 가능하다. Error(오류) Error는 시스템에 비정상적인 상황이 생겼을 때 발생한다. 예를 들어 JVM의 메모리 부족, 스택 오버플로우, 메모리 누수(memory leak)과 같은 복구할 수 없는 상태를 나타낸다. 프로그래머가 미리 예측할 수 없기 때문에 처리할 수 없어서 신경쓰지 않아도 된다. (처리할 수 없으니까) StackOverFlowError, OutOfMemoryErr..

JAVA 2022.02.13

IntelliJ 단축키 설정

인텔리제이를 처음 사용하고 느꼈던 것은 단축키와 자동완성이 정말 편리하다는 것이다. sts는 자동완성이 되긴 하지만 잘 안되다보니... 거의 모든 코드를 내가 직접 입력했던 것 같은데 인텔리제이는 자동완성이 워낙 잘되어있어 마치 내가 다음에 뭘 입력할지를 미리 예측하고 자동 완성을 해주는 것 같은 느낌까지 든다. 어쨌든 이러한 인텔리제이의 장점을 살리기 위해서 단축키도 여럿 정리해보았다. 개발할 때 요정도만 알고 있어도 크게 불편함은 없는 듯 하다. 만약 이 중에서 손에 안 익는 단축키가 있거나, 추가하고 싶은 단축키가 있다면 setting > keymap에서 설정을 해주면 된다. shift * 2 : 파일 탐색 ctrl + shift + f : 문자열 검색 alt + 방향키 : 파일간 이동 ex) al..

JAVA 2021.11.30

Call By Value / Call By Reference

* Call By Value 인수의 값을 해당 함수의 형식 매개변수에 복사한다. 따라서 해당 함수가 내부에서 매개변수를 이용하여 값을 바꾸더라도 인수에 영향을 미치지 않는다. 매개 변수는 다른 메모리의 주소를 가진다. Call By Value의 예 public class Tester{ public static void main(String[] args){ int a = 30; int b = 45; System.out.println("Before swapping, a = " + a + " and b = " + b); // Invoke the swap method swapFunction(a, b); System.out.println("\n**Now, Before and After swapping values..

JAVA 2021.08.14

객체 복제

* 객체 복제(clone()) 객체 복제는 원본 객체의 필드값과 동일한 값을 가지는 새로운 객체를 생성하는 것을 말한다. 객체를 복제하는 이유는 원본 객체를 안전하게 보호하기 위함이다. 신뢰하지 않는 영역으로 원본 객체를 넘겨 작업할 경우, 원본 객체의 데이터가 훼손될 수 있기 때문에 복제된 객체를 만들어 신뢰하지 않는 영역으로 넘기는 것이 좋다. 복제된 객체의 데이터가 훼손되더라도 원본 객체는 아무런 영향을 받지 않기 때문에 안전하게 데이터를 보호할 수 있게 된다. 객체를 복제하는 방법에는 얕은 복제와 깊은 복제가 있다. * 얕은 복제 (thin clone) 단순히 필드값을 복사해서 객체를 복제하는 것을 말한다. 필드 값만 복제하기 때문에 필드가 기본 타입일 경우 값 복사가 일어나고, 필드가 참조타입일..

JAVA 2021.08.11

추상 클래스 (Abstract class)

* 추상 클래스 (Abstract class) 객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다면 이 클래스의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라고 한다. 추상 클래스와 실체 클래스는 상속의 관계를 가지고 있다. 추상 클래스가 부모이고 실체 클래스가 자식으로 구현되어 실체 클래스는 추상 클래스의 모든 특성을 물려받고, 추가적인 특성(필드, 메소드)를 가질 수 있다. 추상 클래스는 실체(구현) 클래스의 공통되는 필드와 메소드를 추출해서 만들었기 때문에 객체를 직접 생성해서 사용할 수 없다. 다시 말해서 추상 클래스는 new 연산자를 사용해서 인스턴스를 생성시키지 못한다. * 추상 클래스의 용도 1. 실체 클래스들의 공통된 필드와 메소드의 이름을 통일할 목적 실체 클래스를 설계하..

JAVA 2021.07.29

Static

* JAVA에서의 Static? static(정적)은 '고정된'이란 의미를 가지고 있다. 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다. 이들을 각각 정적 필드, 정적 메소드라고 말한다. 정적 멤버는 객체 (인스턴스)에 소속된 멤버가 아니라 클래스에 소속된 멤버이기 대문에 클래스 멤버라고도 한다. * 정적 멤버 선언 정적 필드와 정적 메소드는 클래스에 고정된 멤버이므로 클래스 로더가 클래스(바이트 코드)를 로딩해서 메소드 메모리 영역에 적재할 때 클래스 별로 관리된다. 따라서 클래스의 로딩이 끝나면 바로 사용할 수 있다! 객체를 생성할 필요 없이 클래스가 메모리에 로딩되면 바로 사용할 수 있는 필드와 메소드인 것이다. 필드를 선언할 때 인스턴스 필드로 ..

JAVA 2021.07.21

Map Collection

* Map? 키(key)와 값(value)로 구성된 entity 객체를 저장하는 구조를 가지고 있다. 키/값 둘 다 모두 객체이다. 키는 중복 저장될 수 없지만 값은 중복 저장될 수 있다. 만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치된다. Map 컬렉션에는 HashMap, Hashtable, LinkedHashMap, Properties, TreeMap 등이 있다. * Map 컬렉션에서 공통적으로 사용 가능한 Map 인터페이스의 메소드 K / V라는 타입 파라미터는 Map 인터페이스가 제네릭 타입이기 때문이다. 구체적인 타입은 구현 객체를 생성할 때 결정된다. 키를 알고있다면 get()메소드로 간단하게 객체를 찾아오면 되지만, 저장된 객체 전체를 대상으로 ..

JAVA 2021.07.08