728x90

Obj. 자바의 Class에 대해 학습.

Todo.

5-1. 클래스 정의하는 방법

5-2. 객체 만드는 방법 (new 키워드 이해하기)

5-3. 메소드 정의하는 방법

5-4. 생성자 정의하는 방법

5-5. this 키워드 이해하기

Optional

1. Int 값을 가지고 있는 이진 트리를 나타내는 Node 라는 클래스를 정의하세요.

2. Int value, Node left, right를 가지고 있어야 합니다.

3. BinrayTree라는 클래스를 정의하고 주어진 노드를 기준으로 출력하는 bfs(Node node)와 dfs(Node node) 메소드를 구현하세요.

4. DFS는 왼쪽, 루트, 오른쪽 순으로 순회하세요.

5-1 클래스 정의하는 방법

클래스란? 속성이 비슷한 것들을 모아둔 것으로 Camel 표현법으로 작성을 하는게 관례이다.

총 3가지로 구성되어 있으며 필드, 생성자, 메소드가 있다.

public class 클래스이름{
//필드

	int 변수

	public 클레스이름(){ //생성자
	
    }
	
    void 함수(){....} // 메소드
   

생성자 : 리턴 타입이 없으며, Heap영역에 생성되고 주소가 반환된다.

5-2 객체 만드는 방법

Pair pair = new Pair();

new 연산자로 객체를 생성한다. 클래스로 부터 객체를 만드는 과정을 클래스의 인스턴스화 라고 한다.

5-3 메소드 정의하는 방법

public class 클레스이름{
	리턴타입 메소드 이름([매개변수, ...]){
    	매소드 실행 블록
        }
}

메소드는 오버로딩이 가능하다.

5-4 생성자 정의하는 방법

Pair(){}

Pair(int x, int y){
	Method
    Method
    }

5-5 this 키워드 이해하기

this 키워드는 객체 자신을 의미한다. 또한 인스턴스 자신을 가르킨다.

public class Point{
	int x, y, z;
    Point(int x, int y){
    	this.x = x;
        this.y = y;
        }
    Point(int x, int y, int z){
    	this(x,y);
        this.z = z;
        }
}
728x90
728x90

Obj.자바가 제공하는 제어문을 학습.

Todo.

4-1 선택문

4-2 반복문

Assgnment.

0. JUnit5 학습하기

1. live-study 대시보드 만드는 코드 작성

2. LinkedList 구현

3. Stack 구현

4. ListNode를 사용 Stack 구현

5. Queue 구현

4-1 선택문

주어진 조건으로 if문과 switch문으로 나뉘어 진다. 두 방법은 간단하므로 넘어간다. switch문은 다양한 방법이 있으니 3주차에서 한 글을 보면 될듯

4-2 반복문

기본적으로 while문과 for문이 있음.

while(boolean 조건식){
    조건이 true일때 계속 반복 된다.
    조건이 false이면 while문이 종료 된다.
    break; 를 만나도 종료가 된다.
    continue; 를 만나면 가장 가까운 반복문으로 진행한다.
} 

do{
    일단 한번 진행하고나서
    조건이 true일때 계속 반복 된다.
    }while(조건);

for문에는 여러가지가 있다.

1. 기본

기본적인 for문
for(int i = inital value; i < iterate time; i++){
    do something.
    continue, break 모두 사용 가능하다.
}

2. Label 사용

lable : for(조건식){
    do something
    for(조건식){
        break label; // 이 경우에는 label이 달린 for문이 중단된다.
        continue label://이 경우에는 label이 달린 for문의 continue가 진행된다.
        }
    }

3. Enhanced for문 (For each)

for(Type 변수 : Collection<Type> or Type[] array){
    변수를 활용하여 do somethings.
}

코드
int[] Arr = {1,2,3,4,5,6,7,8,9};
int sum = 0;
for(int v : Arr){
    sum += v;
}

A-0 JUnit 5

JUnit 5의 user-guide를 기반으로 합니다.

1. JUnit 5의 특징

  • JUnit은 Java 8 이상에서 동작하고, 자바용 단위 테스트 작성을 위한 것이다.
  • 접근 제어자가 변경이 가능하다.
  • Extention 하나로 여러 규칙을 통합하고 조합이 가능하다.

2. 어노테이션

  • @Test : Test 메서드 임을 나타 내는 것이다.
  • @TestFactory : 동적 테스드들 위한 것.
  • @DisplayName("test name") : 디스플레이 네임을 정의.
  • @BeforeEach : 각각의 테스트 메서드 전에 실행. (JUnit4 : @Before)
  • @AfterEach : 각각의 테스트 메서드 후에 실행. (JUnit4 : @After)
  • @BeforeAll : 모든 테스트 메서드들 전에 실행. (JUnit4 : @BeforeClass)
  • @AfterAll : 모든 테스트 메서드들 후에 실행됩니다.(JUnit4 : @AfterClass)
  • @Nested : nested, non-static 테스트 클래스임을 나타냄.
  • @Tag("tag name") : 테그들을 정의.
  • @ExtendWith : custom extensions을 등록할때 사용
  • @Disable : 메서드 를 비활성화 할때 사용.(JUnit4 : @ignore)
  • @Order(정수 값) : 우선순위 지정

3. Assertion

람다식을 사용 할 수 있게 되었음.

  • assertTrue & assertAll

    class AssertionsDemo {
    
        private final Calculator calculator = new Calculator();
    
        private final Person person = new Person("Jane", "Doe");
    
        @Test
        void standardAssertions() {
            assertEquals(2, calculator.add(1, 1));
            assertEquals(4, calculator.multiply(2, 2),
                    "The optional failure message is now the last parameter");
            assertTrue('a' < 'b', () -> "Assertion messages can be lazily evaluated -- "
                    + "to avoid constructing complex messages unnecessarily.");
        }
    
        @Test
        void groupedAssertions() {
            // In a grouped assertion all assertions are executed, and all
            // failures will be reported together.
            assertAll("person",
                () -> assertEquals("Jane", person.getFirstName()),
                () -> assertEquals("Doe", person.getLastName())
            );
        }
  • assertThat
    Third-party 라이브러리로 hamcrest를 사용해야 한다.

    import static org.hamcrest.CoreMatchers.equalTo;
    import static org.hamcrest.CoreMatchers.is;
    import static org.hamcrest.MatcherAssert.assertThat;
    
    import example.util.Calculator;
    
    import org.junit.jupiter.api.Test;
    
    class HamcrestAssertionsDemo {
    
        private final Calculator calculator = new Calculator();
    
        @Test
        void assertWithHamcrestMatcher() {
            assertThat(calculator.subtract(4, 1), is(equalTo(3)));
        }
    
    }

A-1 live-study 대시보드 만드는 코드 작성

  • 깃헙 이슈 1번부터 18번까지 댓글을 순회하며 댓글을 남긴 사용자를 체크 할 것.
  • 참여율을 계산하세요. 총 18회에 중에 몇 %를 참여했는지 소숫점 두자리가지 보여줄 것.
  • Github 자바 라이브러리를 사용하면 편리합니다.
  • 깃헙 API를 익명으로 호출하는데 제한이 있기 때문에 본인의 깃헙 프로젝트에 이슈를 만들고 테스트를 하시면 더 자주 테스트할 수 있습니다.
public class dashBoard{
    static private final String token = "token";
    static private int cnt;
    public static void dashBoard() throws IOException {
        GitHub gitHub = new GitHubBuilder().withOAuthToken(token).build();
        GHRepository ghRepository = gitHub.getRepository("whiteship/live-study");

        List<GHIssue> issues = ghRepository.getIssues(GHIssueState.ALL);//이슈 다 가져오기
        cnt = issues.size();
        Map<String , Integer> participant = new HashMap<>();
        Set<String> member = new HashSet<>();

        for (GHIssue issue : issues){
            List<GHIssueComment> comments = issue.getComments();
            for(GHIssueComment comment: comments){
                member.add(comment.getUser().getLogin());
            }
            for (String tmp : member){
                if(!participant.containsKey(tmp))
                    participant.put(tmp,1);
                else participant.put(tmp,participant.get(tmp)+1);
            }
        }
        BufferedWriter bf = new BufferedWriter(new OutputStreamWriter(System.out));
        participant.forEach((key, value)->{
            double percent = (double)(value*100)/cnt;
            try {
                bf.write(key+" : "+String.format("%.2f",percent)+"%\n");
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        bf.close();
    }
}

2. LinkedList 구현

  • LinkedList에 대해 공부하세요.
  • 정수를 저장하는 ListNode 클래스를 구현하세요.
  • ListNode add(ListNode head, ListNode nodeToAdd, int position)를 구현하세요.
  • ListNode remove(ListNode head, int positionToRemove)를 구현하세요.
  • boolean contains(ListNode head, ListNode nodeTocheck)를 구현하세요.
public class ListNode {
    int data;
    ListNode next;
    public ListNode() {
    }
    public ListNode(int data) {
        this.data = data;
    }
    public ListNode add(ListNode head, ListNode nodeToAdd, int position){
        ListNode list = head;
        for (int i = 0; i < position-1; i++) {
            list = list.next;
        }
        nodeToAdd.next = list.next;
        list.next = nodeToAdd;

        return head;
    }
    public ListNode remove(ListNode head, int positionToRemove){
        ListNode list = head;
        ListNode dnode;
        if (positionToRemove == 0){
           dnode = list;
           head = list.next;
           dnode.next = null;
           return dnode;
        }
        for (int i = 0; i < positionToRemove-1; i++) {
            list = list.next;
        }
        dnode = list.next;
        list.next = dnode.next;
        dnode = null;
        return dnode;
    }
    public boolean contains(ListNode head, ListNode nodeTocheck){
        while (head.next != null){
            if (head.data == nodeTocheck.data)
                return true;
            head = head.next;
        }
        return false;
    }
}

3. Stack 구현

  • int 배열을 사용해서 정수를 저장하는 Stack을 구현하세요.
  • void push(int data)를 구현하세요.
  • int pop()을 구현하세요.
public class Customstack {
    int[] stack;
    int top;

    public Customstack(int size) {
        this.stack = new int[size];
        top = -1;
    }
    public void push(int data){
        stack[++top] = data;
    }
    public int pop(){
        if (top == -1)
            return top;
        return stack[top--];
    }
}

4. 앞서 만든 ListNode를 사용해서 Stack을 구현하세요.

  • ListNode head를 가지고 있는 ListNodeStack 클래스를 구현하세요.
  • void push(int data)를 구현하세요.
  • int pop()을 구현하세요

 

public class ListNodeStack {
    ListNode listNode;
    int top;
    public ListNodeStack() {
        listNode = new ListNode();
        top = -1;
    }
    public void push(int data){
        listNode.add(listNode,new ListNode(data),top++);
    }
    public int pop(){
        if (top == -1)
            return top;
        return listNode.remove(listNode,top--).data;
    }
}

5. Queue를 구현하세요.

 

 

  • 배열을 사용해서 한번
  • ListNode를 사용해서 한번.

배열을 이용

public class ArrayQueue {
    int top,end;
    int[] queue;

    public ArrayQueue(int size) {
        queue = new int[size];
        top=end=0;
    }
    public void push(int data){
        queue[end++] = data;
    }
    public int pop(){
        if (top == end)
            return -1;
        return queue[top++];
    }

}

ListNode 사용

public class ListNodeQueue {
    ListNode listNode;
    int top,end;

    public ListNodeQueue() {
        listNode = new ListNode();
        top=end=0;
    }
    public void push(int data){
        listNode.add(listNode,new ListNode(data),top++);
    }
    public int pop(){
        if (top==end)
            return -1;
        return listNode.remove(listNode,end++).data;
    }
}

 

728x90
728x90

Obj. 자바가 제공하는 다양한 연산자를 학습.

  1. 산술 연산자
  2. 비트 연산자
  3. 관계 연산자
  4. 논리 연산자
  5. instanceof
  6. assignment operator
  7. 화살표 연산자
  8. 3항 연산자
  9. 연산자 우선 순위
  10. (optional) Java 13.switch 연산자

3-1 산술 연산자

수학적인 연산에 사용 할 수 있는 기호를 의미한다.

+,-,*,/,% 등이 있다.

3-2 비트 연산자

숫자를 2진수 형태로 표현하여 비트 연산을 표현한다.

& AND 두 비트가 모두 1일때 1
| OR 두 비트중 하나라도 1이 있으면 1
^ XOR 연산하는 비트가 서로 다르면 1
~ NOT 비트 반전

3-3 관계 연산자

> >= < <= == !=
크다 크거나 같다 작다 작거나 같다 같다 다르다

3-4 논리 연산자

&& AND 모두 참
|| OR 참이 하나만 있어도 참
! NOT 반전

3-5 instanceof

래퍼런스 타입 변수가 래퍼런스 타입의 데이터인지 확인하보는 연산이다.

같은 타입일 경우 true 아닐경우 false

 

3-6 assignment operator

대입 연산자 혹은 할당 연산자라고 부른다.

variable 에 literal 을 넣는 방식이 있고 시프트 연산도 존재한다.

a >> b a >>> b a << b
a를 b비트 만큼 오른쪽 이동
(빈자리는 x의 부호 비트로 채워짐)
a를 b비트 만큼 오른쪽 이동
(빈자리는 0으로 채워짐)
a를 b만큼 왼쪽으로 이동
(빈자리는 0으러 채워짐)

3-7 화살표 연산자

자바의 화살표는 람다 표현식이라고 보면 된다.

(매개변수목록) -> {함수 몸체}

 

3-8 3항 연산자

(조건) ? (조건이 참이면 실행) : (조건이 거짓이면 실행)

으로 표현

 

3-9 연산자 우선 순위

괄호를 적절하게 사용하자!

 

3-10 (optional) Java 13. switch 연산자 

일반적인 switch문과 비교해서 추가적인 기능을 할 수 있다. -> 연산도 가능하며, 멀티 케이스, 반환값이 생겼다.

자바에서 yield 표현이 생겼는데 이는 return과 비슷한 기능을 한다고 보면 된다.

 

#Reference

1. https://azderica.github.io/00-java-operation/

2. gblee1987.tistory.com/178?category=534988

3. blog.naver.com/hsm622/222138523668blog.naver.com/hsm622/222150928707

4. velog.io/@nunddu/Java-Switch-Expression-in-Java-14

728x90
728x90

Obj. 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.

Todo.

  1. 프리미티브 타입 종류와 값의 범위 그리고 기본 값
  2. 프리미티브 타입과 레퍼런스 타입
  3. 리터럴
  4. 변수 선언 및 초기화하는 방법
  5. 변수의 스코프와 라이프타임
  6. 타입 변환, 캐스팅 그리고 타입 프로모션
  7. 1차 및 2차 배열 선언하기
  8. 타입 추론, var

2-1 프리미티브 타입 종류와 값의 범위 그리고 기본 값

프리미티브 (Primitive) : 원시타입 혹은 기본형 타입이라고 한다. (1byte = 8 bit)

  타입 메모리크기 기본 값 표현범위
논리형 boolean 1 byte false true, false
정수형 byte 1 byte 0 -128 ~ 127
short 2 bytes 0 -32768 ~ 32767
int 4 bytes 0  -2147483648 ~ 2147483647
long 8 bytes 0L -2^63 ~2^63-1
실수형 float 4 bytes 0.0F  (3.4 X 10^-38) ~ (3.4 X 10^38) 의 근사값
double 8 bytes 0.0 (1.7 X 10^-308) ~ (1.7 X 10^308) 의 근사값
문자형 char 2 bytes '\u0000'(0을 의미)  0 ~ 65535

2-2 프리미티브 타입과 레퍼런스 타입

Primitive Type Reference Type
기본타입 참조타입
byte, short 등등 class, interface, enum, array, String
객체가 아니며 값을 저장함 주소를 저장한다.

2-3 리터럴

프로그램에서 직접 표시한 값을 의미한다. 값 그 자체로 메모리에 저장되어 있어서 변하지 않는 값 그자체를 의미한다.

2-4 변수 선언 및 초기화 하는 방법

변수 선언은 자료형 + 변수 이름을 적는다

초기화는 3가지 방법이 있다.

  • 명시적 초기화
    변수 선언과 동시에 초기화를 한다.
  • 생성자
    생성자를 만들어 초기화를 함.
  • 초기화 블럭
    복잡한 상황에서 초기화 코드를 만든다.

2-5 변수의 스코프와 라이프타임

  • 전역변수
    함수 밖에 선언되어 클래스 전체에서 사용이 가능하다
    프로그램이 종료되어야 사라짐.
  • 지역변수
    함수 안에 선언된 변수를 의미한다.
    함수가 종료되면 사라진다.

2-6 타입 변환, 캐스팅 그리고 타입 프로모션

타입변환은 변수 또는 리터럴 타입을 다른 타입으로 변환하는 것이다.

변수의 크기가 큰 것에서 작은 자료형으로 타입 변환 할때는 데이터의 손실이 발생할 수 있으므로 이를 주의해야한다.

타입 프로모션은 작은 타입에서 큰 타입으로 변환하는 것에 대한 생략이 가능한 것이다.

 

2-7 1차 및 2차 배열 선언하기

자바에서 배열선언은 간단하다.

int[] array = {1,2,3,4,5};
int[] array1 = new int[5];
int[][] array2 = {{1,2,3},{1,2,3}};
int[][] array3 = new int[row][col];

 

2-8 타입 추론, var

컴파일러가 데이터 타입이 무엇인지 추론 하는 것.

var를 사용할 때 유의할 점

  • 로컬 변수이어야 함.
  • 선언과 동시에 초기화가 되어야 한다.
  • null 초기화면 작동하지 않음
  • 람다 표현식에는 사용할 수 없다.
  • 타입이 없어서 배열에 초기값을 넘겨도 작동하지 않는다.

 

#Reference

1. https://azderica.github.io/00-java-jvm/

2. gblee1987.tistory.com/173

3. blog.naver.com/hsm622/222138523668

728x90
728x90

Obj. 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.

Todo.

  1. JVM이란 무엇인가?
  2. 컴파일 하는 방법.
  3. 실행하는 방법.
  4. 바이트 코드란 무엇인가?
  5. JIT 컴파일러란 무엇이며 어떻게 동작하는지?
  6. JVM 구성요소
  7. JDK와 JRE의 차이

1-1 JVM이란 무엇인가?

-> JVM은 Java Virtual Machine의 줄임말로 자바 가상 머신을 의미하며 다양한 OS에 있어서 관계없이 java 코드를 실행할 수 있도록 하는 것이며 GC(Garbage Collection)등의 기능을 제공하는 것이다.

 

1-2 컴파일 하는 방법

컴파일 이란? .java 파일을 .class파일로 변환하는 과정을 의미한다.

기본적으로 cmd에서 "javac" 명령어를 통해 사용한다. 여기서 여러 옵션이 있으니 찾아보면 좋을 듯하다.

1-3 실행하는 방법.

실행하는 방법은 "java" 명령어를 사용하여 class 파일을 실행시킨다.

1-4 바이트 코드란 무엇인가

프로그램을 실행하기 위해서 JVM이 이해할 수 있는 형태로 번역을 해서 전해줘야 한다. 일반적으로 java 파일은 단지 확장자가 java인 Text파일 이므로 자바 컴파일러로 변화되는 코드의 명령어 크기가 1바이트라서 바이트코드라고 한다고 함.

1-5 JIT 컴파일러란 무엇이며 어떻게 동작하는지?

JIT : Just In Time 컴파일러로 바이트 코드를 기계어로 번역하는 것을 의미한다. 기본적으로 인터프리터 방식은 바이트코드를 한 줄씩 읽으면서 코드를 실행시키기에 동일한 메소드를 중복 실행 시키는 비효율이 있기에 JIT는 런타임시 바이트 코드를 네이티브 기계어로 한번에 컴파일 후에 캐싱을 통해 사용한다.

1-6 JVM 구성요소

JVM 구조

JVM의 구조

  • Class Loader(클래스 로더)
    • JVM내로 클래스를 로드하고 링크를 통해 배치한다. 실행시 동적으로 클래스를 로드하며 사용하지 않는 클래스는 메모리에서 제거함.
  • Execution Engine(실행 엔진)
    • 클래스 로더에서 분석된 클래스 파일의 데이터를 저장하고 실행 도중에 필요한 데이터를 저장하고 실행 도중에 필요한 데이터를 실행
    • Interpreter, JIT Compiler, Garbage Collector 등이 있음.
  • Runtime Data Area
    • 5가지 영역으로 나뉜다
      1. Method 영역 : 모든 클래스 레벨의 데이터는 이곳에 저장된다. JVM은 오직 하나의 메서드 영역만 가지고 자원을 공유한다.
      2. Heap 영역 : 모든 objects들과 인스턴스 변수, 배열은 이곳에 저장된다. 이 또한 하나의 힙 영역만 가지고 있음.
      3. Stack 영역 : 모든 스레드에 대하여 저장이 되고 메서드가 종료되면 공간에서 삭제된다.
      4. PC 레지스터
      5. Native Method 스택

1-7 JDK와 JRE의 차이

JDK : Java Development Kit

JRE : Java Runtime Environment

의 차이로 JRE는 JVM과 클래스 라이브러리와 같이 실행환경을 의미하고,  JDK는 JRE와 함께 개발에 필요한 SW를 모아둔 것이다.

 

#Reference

1. adnjavainterview.blogspot.com/2017/04/java-vertual-machinejvm-architecture-in.html

2. https://azderica.github.io/00-java-jvm/

3. gblee1987.tistory.com/173

4. blog.naver.com/hsm622/222138523668

728x90

+ Recent posts