유튜브 - 얄팍한 코딩사전

사람이 작성한 코드는 컴퓨터는 알지 못한다. (.java)


컴퓨터가 아는 언어로(0,1) 변환해줘야하는데 이러한 작업을 컴파일(.class)이라고 한다.

 

이때, 자바의 경우에는 자바 바이트 코드로 컴파일 한다.

정리

1. 사람이 읽을 수 있는(source, code) 작성을 하고 저장하면

2. (.java) -> (.class)로 컴파일된다. JB(자바 바이트 코드)로.

3. 실행을 하면 JBJVM에 사인을 준다.

4. 사인을 받은 JVM컴퓨터에 사인을 보낸다.

5. 프로그램 실행!

 

추가] JRE? JDK?

JDK - Java Development Kit

JRE - Java Runtime Environment (자바 실행환경)

JDK가 요리 레시피를 개발하는 회사라고 가정하자.

JRE에는 JVM이란 주방장이 있고, 레시피(표준 라이브러리)가 있다.

System.out.println("자바 개발")
/*
  이렇게 입력하면 JVM은 실행 방법을 라이브러리에서 확인한다.
  System을 라이브러리에서 찾는거라 보면 된다.
*/

 

맨 위 설명에도 나왔지만,

JDK안에는 개발자가 작성한 코드를 주방장(JVM)이 읽을 수 있도록 번역해주는 컴파일러가 존재하며,

이외 디버거, jar, 성능 및 모니터링하는 프로파일러가 존재한다.

 

참고자료


https://www.youtube.com/@yalco-coding

 

얄팍한 코딩사전

 

www.youtube.com

'JAVA' 카테고리의 다른 글

[JAVA] Stack & Queue  (0) 2023.05.17
[JAVA] SimpleDateFormat  (0) 2023.05.15
[JAVA] 접근제어자  (0) 2023.05.13
[JAVA] Calendar  (0) 2023.05.12
[JAVA] 자바 메모리 구조(기초)  (0) 2023.05.03
public class StackQueue {
    public static void main(String[] args) {
        Stack st = new Stack();
        Queue q = new LinkedList();

        st.push("0");
        st.push("1");
        st.push("2");

        q.offer("0");
        q.offer("1");
        q.offer("2");

        System.out.println("== Stack ==");
        while (!st.empty()){
            System.out.println(st.pop()); // Stack 요소 꺼내기 2,1,0
        }

        System.out.println("== Queue ==");
        while (!q.isEmpty()){
            System.out.println(q.poll()); // Queue 요소 꺼내기 0,1,2
        }
    }
}

 

▶ Stack

스택(Stack) : LIFO 구조. 마지막에 저장된 것이 가장 먼저 꺼내게 된다.

자바의 정석

저장(push) : 0 -> 1 -> 2

추출(pop) : 2 -> 1 -> 0

 

적합성

배열 vs 링크드리스트(LinkedList) 

배열

        -> 순차적 추가

0 1 2 3  
0 1 2 3  

       <- 순차적 삭제

이렇게 구현하는 것은 배열이 적합하다.

LIFO 구조로는 Stack이 유리.

관련 메서드

자바의정석

- peek() : 아래가 막힌 Stack 구조에서 데이터가 쌓여있다 가정하자. 위에서 봤을 때 보이는 객체 하나만 반환

- push() : 추가

- pop() : 제거

- search() : indexOf와 유사. 단, 1부터 시작한다. 못찾으면 -1 반환


▶ Queue (interface)

저장(offer) : 0 -> 1 -> 2

추출(poll) : 0 -> 1 -> 2

 

적합성

배열 vs 링크드리스트(LinkedList)

링크드리스트.

 

-> 배열의 index를 중간에 하나라도 삭제/추가하면 자리를 한칸씩 옮겨야한다. (비효율)  

0 1 2  

-> 링크드리스트는 해당 인덱스만 삭제하고 자리를 옮기지 않는다.

0 - 1 - 2

FIFO 구조로는 Queue가 유리. 

관련 메서드

- offer() : 추가(예외발생X)

- poll() : 삭제 (비어있으면 null반환, 예외발생X)

- add() : 추가 (예외발생O)

- remove() : 삭제 (비어있으면 NoSuchElementException 발생, 예외 발생O)

- peek() : 밑에서 봤을 떄 가장 먼저 보이는 객체

 

사용법

Queue는 인터페이스입니다.

- Queue를 직접 구현.

- Queue를 구현한 클래스 사용

ex) AbstractQueue, ArrayBlockingQueue, LinkedList 등

 

강조

Queue(FIFO)을 구현하는 데에는 배열보단 링크드리스트가 유리하다.

'JAVA' 카테고리의 다른 글

[JAVA] JAVA는 어떻게 실행되는 것일까?  (0) 2023.05.29
[JAVA] SimpleDateFormat  (0) 2023.05.15
[JAVA] 접근제어자  (0) 2023.05.13
[JAVA] Calendar  (0) 2023.05.12
[JAVA] 자바 메모리 구조(기초)  (0) 2023.05.03

날짜와 시간을 다양한 형식으로 출력해준다.

 

▶ 기본
Date today = new Date();
SimpleFormat sdf = new SimpleFormat("yyyy-MM-dd");

String result = sdf.format(today); // 2023-05-15

 

▶ 날짜 기호

날짜

▶ 시간 기호

시간

 

public class SimpleDateFormatRun {
    public static void main(String[] args) {
        Date today = new Date(); // 현재의 날짜와 시간
        SimpleDateFormat sdf1, sdf2, sdf3, sdf4;
        SimpleDateFormat sdf5, sdf6, sdf7, sdf8, sdf9;

        sdf1 = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(sdf1.format(today)); // 2023-05-15

        sdf2 = new SimpleDateFormat("''yy년 MMM dd일 E요일");
        System.out.println(sdf2.format(today)); // 23년 5월 15일 월요일

        sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        System.out.println(sdf3.format(today)); // 2023-05-15 22:28:04.622

        sdf4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
        System.out.println(sdf4.format(today)); // 2023-05-15 22:28:04 오후
        System.out.println();

        sdf5 = new SimpleDateFormat("오늘은 올 해의 D번째 날이다.");
        System.out.println(sdf5.format(today)); // 135

        sdf6 = new SimpleDateFormat("오늘은 이 달의 d번째 날이다.");
        System.out.println(sdf6.format(today)); // 15

        sdf7 = new SimpleDateFormat("오늘은 올 해의 w번째 주이다.");
        System.out.println(sdf7.format(today)); // 20

        sdf8 = new SimpleDateFormat("오늘은 이 달의 W번째 주이다.");
        System.out.println(sdf8.format(today)); // 3

        sdf9 = new SimpleDateFormat("오늘은 이 달의 F번째 E요일이다.");
        System.out.println(sdf9.format(today)); // 3번째 월요일
    }
}

위는 날짜와 시간을 문자열로 바꾼 것이다.

 

문자열을 날짜와 시간으로 바꾸는 것도 가능하다.

public class SimpleFormatRun2 {
    public static void main(String[] args) {
        DateFormat df  = new SimpleDateFormat("yyyy년 MM월 dd일"); // 여기서 Date()로 먼저 바꿔야한다.
        DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");

        try{
            Date d = df.parse("2023년 05월 15일"); // 문자열 -> 날짜로
            System.out.println(df2.format(d)); // 날짜 -> 문자열
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

'JAVA' 카테고리의 다른 글

[JAVA] JAVA는 어떻게 실행되는 것일까?  (0) 2023.05.29
[JAVA] Stack & Queue  (0) 2023.05.17
[JAVA] 접근제어자  (0) 2023.05.13
[JAVA] Calendar  (0) 2023.05.12
[JAVA] 자바 메모리 구조(기초)  (0) 2023.05.03

접근제어자

접근제어자는 인스턴스 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 함

출처 :&nbsp;https://88240.tistory.com/448

 

접근범위 : public > protected > default > private

 

public (제한 없음)

public

protected (같은 패키지 + 자손클래스)

protected

default (같은패키지)

default

private (같은 클래스)

private

접근 제어자 사용하는 이유

 - 외부로부터 데이터 보호하기 위해 (캡슐화)

 - iv에 직접 접근 하는 것 보다 메서드를 통해 간접 접근 시키는 것이 좋다. ex) get, set

 

참고사항

 - 내부 클래스에서만 사용하는 메서드인데 굳이 외부의 접근을 허용할 필요는 없다.

'JAVA' 카테고리의 다른 글

[JAVA] Stack & Queue  (0) 2023.05.17
[JAVA] SimpleDateFormat  (0) 2023.05.15
[JAVA] Calendar  (0) 2023.05.12
[JAVA] 자바 메모리 구조(기초)  (0) 2023.05.03
[JAVA] Wrapper 클래스란?  (0) 2023.05.01

Calendar 레퍼런스

더보기

java.util.Date (JDK 1.0)

개선

java.util.Calendar (JDK 1.1) : 여전히 단점 존재, 97년~2014년까지 사용됨

개선

java.util.time (JDK 1.8)

- Date와 Calendar의 단점을 개선했다. 새로운 클래스를 제공

출처 :&nbsp;https://royzero.tistory.com/4

Calendar 클래스

- 추상 클래스 이므로 객체 생성 불가X

Calendar cal = new Calendar(); // 에러

Calendar cal = Calendar.getInstance();

  • get()으로 날짜와 시간 필드 가져오기 int get(int field) 

테스트 소스입니다.

더보기
Calendar cal = Calendar.getInstance(); // Calendar 객체 생성
// 2023 05월 12일 기준
System.out.println("올해년도 : "         + cal.get(Calendar.YEAR));
System.out.println("월(0~11), 0:1월 : " + cal.get(Calendar.MONTH));
System.out.println("올해의 몇째 주 : "   + cal.get(Calendar.WEEK_OF_YEAR));
System.out.println("이 달의 몇째 주 : "  + cal.get(Calendar.WEEK_OF_MONTH));

System.out.println("이 달의 몇 일 : "    + cal.get(Calendar.DATE)); // 같다.
System.out.println("이 달의 몇 일 : "    + cal.get(Calendar.DAY_OF_MONTH)); // 같다.
System.out.println("올해의 몇 일 : "     + cal.get(Calendar.DAY_OF_YEAR));
System.out.println("요일(1~7, 1:일요일 ... 7:토요일) : " + cal.get(Calendar.DAY_OF_WEEK));
System.out.println("이 달의 몇 째 요일 : "+ cal.get(Calendar.DAY_OF_WEEK_IN_MONTH) );
System.out.println("오전_오후(0:오전, 1:오후)" + cal.get(Calendar.AM_PM));

System.out.println("시간(0~11) : " + cal.get(Calendar.HOUR));
System.out.println("시간(0~23) : " + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("분(0~59) : " + cal.get(Calendar.MINUTE));
System.out.println("초(0~59) : " + cal.get(Calendar.SECOND));
System.out.println("1000분의 1초(0~999) : " + cal.get(Calendar.MILLISECOND));
System.out.println("TimeZone(-12 ~ +12) : " + (cal.get(Calendar.ZONE_OFFSET)/(60*60*1000)));
System.out.println("이 달의 마지막 날 : " + cal.getActualMaximum(Calendar.DATE));

날짜 계산하기

더보기
class _02_JavaCalendarSet_날짜계산 {
    public static void main(String[] args) {
        final String[] DAY_OF_WEEK = {"", "일", "월", "화", "수", "목", "금", "토"};
        Calendar date1 = Calendar.getInstance();
        Calendar date2 = Calendar.getInstance();

        date1.set(2020, 5, 11); // 날짜는 개발자가 지정할 수 있음.

        System.out.println("date1은 " + toString(date1)
                + DAY_OF_WEEK[date1.get(Calendar.DAY_OF_WEEK)] + "요일이고"); 
                // date1은 2020년 6월 11일 목요일이고

        System.out.println("오늘(date2)는 " + toString(date2)
                + DAY_OF_WEEK[date2.get(Calendar.DAY_OF_WEEK)] + "요일입니다."); 
                // 오늘(date2)는 2023년 5월 12일 금요일입니다.

        // 두 날짜의 시간 차이 얻으려면, getTimeInMillis() 천분의 일초 단위로 변환
        long difference = (date2.getTimeInMillis() - date1.getTimeInMillis()) / 1000;

        System.out.println("그 날부터(date1) 지금(date2)까지 " + difference + " 초가 지났습니다.");
        // 92016000
        System.out.println("일(day)로 계산하면 " + difference/(24 * 60 * 60) + " 일입니다.");
        // 1065
    }

    public static String toString(Calendar date){
        return date.get(Calendar.YEAR) + "년" + (date.get(Calendar.MONTH)+1) + "월" + date.get(Calendar.DATE) + "일";
    }
}

시간 계산하기

더보기
public class _03_JavaCalendarSet_시간계산 {
    public static void main(String[] args) {
        final int[] TIME_UNIT = {3600, 60, 1};
        final String[] TIME_UNIT_NAME = {"시간 ", "분 ", "초"};

        Calendar time1 = Calendar.getInstance();
        Calendar time2 = Calendar.getInstance();

        time1.set(Calendar.HOUR_OF_DAY, 10); // time1을 10시 20분 30초
        time1.set(Calendar.MINUTE, 20);
        time1.set(Calendar.SECOND, 30);

        time2.set(Calendar.HOUR_OF_DAY, 20); // time2을 20시 30분 10초
        time2.set(Calendar.MINUTE, 30);
        time2.set(Calendar.SECOND, 10);

        System.out.println("time1 : " + time1.get(Calendar.HOUR_OF_DAY) + "시 "
                        + time1.get(Calendar.MINUTE) + "분 "
                        + time1.get(Calendar.SECOND) + "초 "
        );
        System.out.println("time2 : " + time2.get(Calendar.HOUR_OF_DAY) + "시 "
                        + time2.get(Calendar.MINUTE) + "분 "
                        + time2.get(Calendar.SECOND) + "초 "
        );

        long difference = Math.abs(time1.getTimeInMillis() - time2.getTimeInMillis()) / 1000;
        System.out.println("time1과 time2의 차이는 " + difference + "초 입니다."); // 36580

        String tmp = "";
        // 거스름돈 원리
        for (int i = 0; i < TIME_UNIT.length; i++) {
            tmp += difference/TIME_UNIT[i] + TIME_UNIT_NAME[i]; // 36580/3600 + 시간
            difference %= TIME_UNIT[i];
        }
        
        System.out.println("시분초로 변환하면 " + tmp + "입니다.");
    }
}

ADD()

더보기
public class _05_JavaCalendarAdd {
    public static void main(String[] args) {

        Calendar date = Calendar.getInstance();
        date.clear(); // 이전 시간에 clear의 중요성 얘기했음. 날짜간의 일 차이가 2일인데 클리어 안해서 1.999998 나오면 1일차로 나옴
        date.set(2020,7,31); // 2020년 8월 31일 설정

        // add() 다른 필드 영향 줌
        date.add(Calendar.DATE, 1); // 2020년 9월 1일
        date.add(Calendar.MONTH, -8); // 2020 1월 1일

        // roll() 다른 필드 영향 XXXXXX
        date.roll(Calendar.DATE, 1); //  2020년 8월 1일
        date.roll(Calendar.MONTH, -8); // 2020년 12월 31일
    }
}

 

 

이 후에는 SimpleDateFormat를 배우고 연습문제로 익히자.

 

https://github.com/JGwanghou

 

JGwanghou - Overview

JGwanghou has 17 repositories available. Follow their code on GitHub.

github.com

'JAVA' 카테고리의 다른 글

[JAVA] SimpleDateFormat  (0) 2023.05.15
[JAVA] 접근제어자  (0) 2023.05.13
[JAVA] 자바 메모리 구조(기초)  (0) 2023.05.03
[JAVA] Wrapper 클래스란?  (0) 2023.05.01
[JAVA] 문자열 다루기  (0) 2023.05.01

1. 자바 프로그램은 JVM 가상머신을 통해 실행.

 

2. 자바 프로그램이 실행되면 운영체제로 부터 메모리를 할당받는다.

 

3. JVM은 용도에 따라 메모리 관리한다

 

출처: TCPSCHOOL

메소드 영역

- .class 파일들은 메소드 영역에 저장

 

힙(Heap) 영역

- 힙 영역은 자바에서 사용되는 모든 인스턴스 변수 저장

- JVM은 자바 프로그램에서 new 키워드로 인스턴스 생성되면, 인스턴스의 정보를 힙에 저장 

 

스택 영역

- 자바에서 메소드가 호출될 때 메소드의 *스택 프레임을 저장

- 메소드의 호출과 관계된 지역변수, 매개변수를 스택 영역에 저장

- 메소드 호출과 함께 스택 영역에 할당되고, 호출 완료 시 소멸

 

* 스택 프레임 : 스택 영역에 저장되는 메소드 호출 정보

 

- push, pop

- LIFO (Last-In First-out) 후입선출

- 메모리의 높은 주소에서 낮은 주소로 할당

'JAVA' 카테고리의 다른 글

[JAVA] 접근제어자  (0) 2023.05.13
[JAVA] Calendar  (0) 2023.05.12
[JAVA] Wrapper 클래스란?  (0) 2023.05.01
[JAVA] 문자열 다루기  (0) 2023.05.01
[JAVA] interface  (0) 2023.05.01

+ Recent posts