새로운 한 주가 시작되고 Java 문법 강의가 시작되었다.
이미 대부분 알고 있는 내용이지만 복습 겸 전체적인 내용을 빠르게 훑으며 강의를 수강했다.
강의 내용 중에서 대학 시절 별로 중요한 내용이라고 생각하지 않아 가볍게 넘어간 JDK 구조에 대해 정리했다.


📚 학습 내용 정리

  • 쿼드트리

https://devhippo.tistory.com/63

 

1992번 - 쿼드트리

[ 문제 풀이 ]1. 입력값이 정수형이 아닌 문자열이다.따라서, scanf 보다는 cin을 사용했다.char 변수를 통해 문자열의 한 글자씩 받아서 저장했다.for (int i = 0; i > img[i][j]; }} 2. 분할하기N을 길이로 사

devhippo.tistory.com

 

  • JDK의 구조

https://devhippo.tistory.com/64

 

JAVA의 구조

JDK (Java Development Kit)자바 프로그램을 개발할 때 필요한 개발 도구 모음JDK (Java Development Kit) ← Java 개발에 필요한 모든 것 포함 ├── JRE (Java Runtime Environment) ← Java 실행 환경 │ ├── JVM (Java V

devhippo.tistory.com

 


학습하며 겪었던 문제점

큰 어려움은 없었다.
쿼드트리 문제를 풀 때, 입력값이 문자열이라는 것을 제대로 확인하지 않고 정수형으로 문제를 풀다가
틀렸다는 결과를 보고 충격을 잠시 받았었다.

주어진 조건을 꼼꼼하게 읽자!


⭐ 내일 학습할 것

사실... 중간에 떡볶이를 잘못 먹고 체해서 강의 중간중간 놓친 부분이 있다.
2 주자 중반 부분부터 어디를 놓쳤는지 확인하고 모르거나 기억하면 좋을 내용을 정리할 예정이다.

계산기 프로젝트의 구현 기능을 구상했다.

  1. Java 그래픽 사용해서 콘솔창이 아닌 진짜 계산기 UI 만들기
  2. 입력값이 여러 개인 경우도 처리 가능
  3. 입력값 하나 지우기, 한 번에 지우기
  4. (시간이 된다면) 삼각함수, 루트, 절댓값 기능 추가하기

고려해야 하는 조건 (정리 중)

  1. 0으로 나누려고 할 때, 나눌 수 없습니다 처리
  2. 기호를 연이어 눌렀을 때, 최근에 누른 한 개의 기호만 사용가능해야 한다.

또 뭐가 있을 지는 내일 프로젝트 발제를 듣고 적당히 조율 및 추가하여 구현할 계획이다.

JDK (Java Development Kit)

자바 프로그램을 개발할 때 필요한 개발 도구 모음

JDK (Java Development Kit)  ← Java 개발에 필요한 모든 것 포함
 ├── JRE (Java Runtime Environment)  ← Java 실행 환경
 │   ├── JVM (Java Virtual Machine)  ← 바이트코드 실행
 │   ├── Java 라이브러리 (rt.jar 등)  ← 필수 API 제공 (java.lang, java.util 등)
 │   ├── 클래스 로더 (Class Loader)  ← .class 파일 로드
 │
 ├── Javac (Java Compiler)  ← .java → .class 변환
 ├── 기타 개발 도구 (디버거, Javadoc 생성기, JAR 도구 등)

 

Java는 Javac와 JVM을 통해서 플랫폼의 독립성을 보장받는다.

Javac 자바 컴파일러

Java 파일을 바이트코드(.class)로 변환한다.
*바이트코드 : JVM이 해석할 수 있는 코드

JVM 자바 가상 머신

바이트코드를 해석하고 실행한다.

JVM 메모리 구조

JVM 메모리는 위의 그림과 같이 크게 3가지로 구성된다.

Method Area

  • 모든 객체가 공유하는 클래스 정보 저장공간
  • 작성했던 모든 파일의 데이터가 저장된다.
  • 프로그램 실행 시점에 한 번만 저장된다.
  • static으로 선언된 변수와 메서드가 위치

Stack Area

  • 메서드 실행 시 사용되는 공간
  • 메서드가 호출될 때마다 Stack영역에 메모리가 할당된다.

Heap Area 

  • 객체가 생성되어 저장되는 공간
  • new 키워드로 생성된 객체가 저장된다.
  • Heap 영역의 객체가 필요 없어지면 가비지 컬렉터가 이를 정리할 수 있다.

'Java' 카테고리의 다른 글

Java - 람다(Lambda) & 스트림(Stream)  (0) 2025.02.25
Java - 제네릭 (Generic)  (0) 2025.02.25
Java - 네트워크 프로그래밍  (0) 2025.02.09
Java - 스레드(Thread)  (0) 2025.02.07
Java - 배열과 리스트  (1) 2025.02.06

[ 문제 풀이 ]

1. 입력값이 정수형이 아닌 문자열이다.

따라서, scanf 보다는 cin을 사용했다.
char 변수를 통해 문자열의 한 글자씩 받아서 저장했다.

for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cin >> img[i][j];
        }
}

 

2. 분할하기

N을 길이로 사용해서 계속 절반씩 분할해 나간다.

void QuadTree(int x, int y, int size) {

    int half = size / 2;
    QuadTree(x, y, half);            // 왼쪽 위
    ...
}

3. 재귀사용

설정한 영역의 값이 모두 동일하지 않을 때, 재귀로 4 분할된 영역을 분할탐색하도록 설정했다.

#include <iostream>
using namespace std;

const int MAX = 64; // 최대 크기 64x64
char img[MAX][MAX]; // 입력 이미지 데이터 저장

// 특정 영역이 모두 같은 숫자인지 확인하는 함수
char checkData(int x, int y, int size) {
    char first = img[x][y]; // 첫 번째 값 기준
    for (int i = x; i < x + size; i++) {
        for (int j = y; j < y + size; j++) {
            if (img[i][j] != first) return '2'; // 값이 다르면 '2' 반환
        }
    }
    return first; // 모두 같다면 해당 값 반환
}

// 쿼드 트리 압축 함수
void QuadTree(int x, int y, int size) {
    char check = checkData(x, y, size);
    
    if (check != '2') { // 모두 같은 숫자인 경우
        cout << check;
        return;
    }
    
    // 다른 숫자가 존재하면 4분할 진행
    cout << "(";
    int half = size / 2;
    QuadTree(x, y, half);            // 왼쪽 위
    QuadTree(x, y + half, half);      // 오른쪽 위
    QuadTree(x + half, y, half);      // 왼쪽 아래
    QuadTree(x + half, y + half, half); // 오른쪽 아래
    cout << ")";
}

int main() {
    int N;
    cin >> N;

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cin >> img[i][j];
        }
    }

    QuadTree(0, 0, N);
    cout << "\n"; // 줄 바꿈
    return 0;
}

 

'coding' 카테고리의 다른 글

13305번 - 주유소  (0) 2025.02.26
1931번 - 회의실 배정  (0) 2025.02.25
1654번 - 이분 탐색 - 랜선 자르기  (0) 2025.02.07
10816번 - 이분 탐색 - 숫자 카드 2  (0) 2025.02.07
1920번 - 이분 탐색 - 수 찾기  (0) 2025.02.07

+ Recent posts