728x90
반응형

얼마 전 면접에서 기술질문을 받았는데 큰 틀만 알고 있어서

제대로 설명을 하지 못한 것에 큰 아쉬움이 있어 살짝 기록해 본다. 

진정한 자바 메모리에 대해 깊게 공부한 내용은 아니지만

일단 기본 내용부터 점점 심화하는 것도 이해를 높이는 좋은 방법이지 않을까 생각한다.

(기술 질문에 약한 편이라 계속 공부중..ㅠ)


자바에 대해 살짝 맛보기 내용부터!

 

JVM (Java Virtual Muchine)

- 자바 가상 머신

- 자바의 바이트 코드를 해석하고 실행하는 역할

 

자바 프로그램의 실행 구조

프로그램

JVM

운영체제

하드웨어

 

자바는 JVM에 의해 실행되므로 어떤 운영체제에서도 동일한 결과를 갖는 것이 큰 장점이다.

단, 한 단계 더 거쳐서 실행되기 때문에 실행 속도면에서 뒤처질 수 있다.

 

런타임 데이터 영역 (Runtime Data Area)

1. Static Area (Method Area)

2. Heap Area

3. Stack Area

4. PC Register

5. Native Method Stack

 

이 글에서는 2, 3번 힙과 스택에 대해서만 정리한다.


Stack Heap
원시타입의 데이터가 값과 저장 Object 타입의 데이터가 저장
Heap 영역에 생성된 Object 타입의 데이터의 참조값이 저장 애플리케이션의 모든 메모리 중 Stack을 제외한 부분
함수가 호출될 때 사용하는 메모리
기능 수행이 끝나면 자동으로 반환되는 메모리
자동으로 관리되지 않는 메모리 영역 (가비지 컬렉터)

 

 

Stack 영역

public class Stack {
	public static void main(String[] args) {
    	int num1 = 20;
        int num2 = 30;
        int sum = 0;
        
        sum = addNum(num1, num2);
        System.out.println(sum);
    }
    
    public static int addNum(int n1, int n2) {
    	int result = n1 + n2;
        return result;
    }
}

 

 

Heap 영역

public class Heap {
	public static void main(String[] args) {
    	int age = 19;
        String name = "mimi";
    }
}

 

Heap 영역에서 GC (Garbage Collection)

- 메모리 누수를 막기 위한 가비지 컬렉션

public class Heap {
	public static void main(String[] args) {
    	String url = "http://";
        url += "mimi.github.io/";
    }
}

url += 부분 코드를 실행하면 기존 문자열에 덧붙이는 것이 아닌

새로운 String 객체를 생성하고 참조하게 되어

기존의 문자열"https://"는 unreachable object가 되어

가비지 컬렉터unreachable object를 제거한다. 

 

위 코드를 실행하면 힙 영역에는 결과적으로 2만 남게 된다.

 

*unreachable object : 스택에 도달할 수 없는 힙 영역의 객체

728x90
반응형

'Coding > Study' 카테고리의 다른 글

[IT 용어] API (Application Programming Interface)  (0) 2023.10.14
[JAVA] 람다식 Lambda  (0) 2023.10.05
[JSP] JSP 강의평가 웹 사이트 개발하기 완료  (0) 2023.10.02
[GitHub] 깃, 깃허브  (0) 2023.09.28
[Kotlin] 코틀린 맛보기  (0) 2023.09.22
728x90
반응형

람다식

- 익명 함수(anonymout function)를 생성하기 위한 식

- 객체 지향 언어보다는 함수 지향 언어에 가깝다.

- 자바 코드가 간결해진다.

- 컬렉션의 요솔르 필터링하거나 매핑해서 원하는 결과를 쉽게 집계할 수 있다.

- (매개변수) -> { 실행코드 } 형태로 작성

 

람다식 -> 매개 변수를 가진 코드 블록 -> 익명 구현 객체

// Runnable 인터페이스 익명 구현 객체 생성하는 전형적인 코드
Runnable runnable = new Runnable() {
    public void run() { ... }
}

// 익명 구현 객체를 람다식으로 표현
Runnable runnable = () -> { ... };

 

 

타겟 타입과 함수적 인터페이스(@FunctionalInterface)

- 람다식의 타겟 타입은 하나의 추상 메소드가 선언된 인터페이스(두 개 이상 선언된 것은 타겟 타입 사용 불가)

- @FunctionalInterface 어노테이션을 인터페이스 선언 시 붙여주면

  두 개 이상의 추상 메소드가 선언되면 컴파일러가 체킹해 오류를 발생해준다. (선택사항)

@FunctionalInterface
public interface MyFunctionalInterface {
    public void method();
    public void otherMethod();	// 컴파일 오류
}

 

 

정적 메소드와 인스턴스 메소드 참조

- 정적(static) 메소드를 참조할 경우 클래스 이름 뒤에 :: 기호를 붙이고 정적 메소드 이름을 기술

public class Main {
    public static int staticMethod(int x, int y) {	// 정적 메소드
        return x + y;
    }

    public int insatanceMethod(int x, int y) {	// 인스턴스 메소드
        return x + y;
    }

    public static void main(String[] args) {
        IntBinaryOperator oper;

	    // 정적 메소드 참조
        oper = (x, y) -> Main.staticMethod(x, y);
        System.out.println("결과1 : " + oper.applyAsInt(1, 2));

        oper = Main::staticMethod;
        System.out.println("결과2 : " + oper.applyAsInt(3, 4));

	    /// 인스턴스 메소드 참조
        Main obj = new Main();
        oper = (x, y) -> obj.insatanceMethod(x, y);
        System.out.println("결과3 : " + oper.applyAsInt(5, 6));

        oper = obj :: insatanceMethod;
        System.out.println("결과4 : " + oper.applyAsInt(7, 8));
    }
}

 

728x90
반응형
728x90
반응형

이번 문제 풀이에서도 느꼈던 stream의 간결함!

for문은 의식의 흐름대로 작성하게 되는 코드라면

stream은 동일한 결과를 내면서도

보기 좋게 정리한 느낌의 코드이다.

 

 

프로그래머스 실제 풀이

 

첫 풀이 코드

import java.util.Arrays;

class Solution {
    public String solution(String s) {
        StringBuilder answer = new StringBuilder();
        String[] arr = s.split(" ");
        int[] intArr = new int[arr.length];
        
        for(int i=0; i<arr.length; i++) {
            intArr[i] = Integer.parseInt(arr[i]);
        }
        
        Arrays.sort(intArr);
        
        answer.append(intArr[0]).append(" ");
        answer.append(intArr[intArr.length-1]);
        
        return answer.toString();
    }
}

 

stream 사용 수정 코드

import java.util.Arrays;

class Solution {
    public String solution(String s) {
        String[] arr = s.split(" ");
        int[] intArr = Arrays.stream(arr).mapToInt(Integer::parseInt).toArray();
        
        Arrays.sort(intArr);
        
        return intArr[0] + " " + intArr[intArr.length - 1];
    }
}

 

 


깊이 있게 공부하기 :

JAVA의 stream, generic, lamda

728x90
반응형
728x90
반응형

코딩테스트를 풀다 보면, 처음에 길게 작성했던 코드를 다시 봤을 때
정말 엄청나게 간결한 코드로 수정이 가능한 경우가 많았다.
오늘 이같은 상황을 또 한 번 마주하게 되어 기록을 남겨본다.
 
 
첫 풀이 코드

class Solution {
    public int[] solution(int[] num_list, int n) {
        int[] answer = new int[(num_list.length - n) + 1];
        
        for(int i=0,j=n-1; i<answer.length; i++, j++) {
            answer[i] = num_list[j];
        }
        return answer;
    }
}

 
stream 사용 수정 코드

import java.util.Arrays;

class Solution {
    public int[] solution(int[] num_list, int n) {
        return Arrays.stream(num_list, n - 1, num_list.length).toArray();
    }
}

 
배열 선언과 for문을 사용했던 코드에서 stream을 사용하니
return 한 줄로 간결하게 작성이 가능하다.
 
마법같은 코드 간소화를 통해 stream 공부도 꾸준히 해야함을 느꼈다.
기존에 1회 정독했었던 자바의 정석, 이것이 자바다 책 stream부분을 다시 읽고
유튜브나 인프런 사이트에서 자바 stream 강의를 다시 한 번 공부해야겠다.

728x90
반응형
728x90
반응형

StringBuilder & StringJoiner

둘 다 문자열을 효율적으로 처리하고 연결하는 데 사용되는 클래스이다.

각각의 목적과 사용법에 약간의 차이가 존재한다.

 


StringBuilder

StringBuilder는 단일 스레드 환경에서 문자열을 빠르게 수정하고 연결하기 위해 사용된다.
StringBuilder 객체는 가변이며, 내부적으로 버퍼를 사용하여 문자열을 구성한다.

이로 인해 문자열을 변경할 때마다 새로운 문자열 객체를 생성하지 않고도 문자열을 효율적으로 처리할 수 있다.
StringBuilder의 주요 메서드로는 append, insert, delete, replace 등이 있다.

class Solution {
    public String solution(String[] arr) {
        StringBuilder answer = new StringBuilder();
        for(String s : arr) {
            answer.append(s);
        }
        return answer.toString();
    }
}

 

 

StringJoiner
StringJoiner는 주로 문자열을 결합하기 위한 작업에 사용된다.
주로 문자열 컬렉션을 연결할 때 사용하며, 요소 간의 구분자를 지정할 수 있다.
예를 들어, 문자열 배열을 연결하고 각 요소를 쉼표로 구분하려면 StringJoiner를 사용할 수 있다.
StringJoiner의 주요 메서드로는 add, setEmptyValue, toString 등이 있으며, 요소를 추가하고 문자열로 변환하는 데 사용된다.

import java.util.StringJoiner;

class Solution {
    public String solution(String[] arr) {
        StringJoiner joiner = new StringJoiner("");
        for (String s : arr) {
            joiner.add(s);	// Java 8 이상에서 'String.join' 메서드 사용 가능
        }
        return joiner.toString();
    }
}

 

 

간단히 말하면, StringBuilder는 문자열을 구성하고 수정하는 데 사용되는 범용 클래스이며, 

StringJoiner는 문자열을 결합하고 요소 간에 구분자를 추가하는 데 특화된 클래스이다다.

따라서 사용 목적에 따라 두 클래스 중 하나를 선택하면 된다.

728x90
반응형

'Coding > Study' 카테고리의 다른 글

[IT 용어] API (Application Programming Interface)  (0) 2023.10.14
[JAVA] 람다식 Lambda  (0) 2023.10.05
[JSP] JSP 강의평가 웹 사이트 개발하기 완료  (0) 2023.10.02
[GitHub] 깃, 깃허브  (0) 2023.09.28
[Kotlin] 코틀린 맛보기  (0) 2023.09.22

+ Recent posts