java 36

왜 main()는 public static void인가?

왜 main()는 public static void인가? 자바에서 main()는 뭘까? 너무나 당연하게 그 자리에 있어서 이것이 특별한 메서드라는 생각조차 하지 않게 된다. main()는 자바 프로그램의 시작점이다. main()은 다른 메서드와 다르게 그 자리에서 실행해볼 수 있다. 좋다. 그런데 어떻게 이런 일이 가능해지는 걸까? 이름 빼고 선언부가 완전히 같은 다른 메서드를 정의해도 그것을 main()를 거치지 않고 실행하기란 불가능하다. 왜 public인가? 우리는 IDE의 Java Application Run으로 프로그램을 실행하는데 익숙하다. 이는 프로그램을 실행하는 주체가 main()이라고 착각하게 만든다. 하지만 잘 알다시피 프로그램을 실행하는 것은 main()이 아니라 JVM이다. 우리는 ..

Java 2021.02.09

[Java]Exception

Exception Exception과 RuntimeException 일반 예외와 런타임 예외를 구분하는 데서 시작해야겠다. Exception 반드시 처리해야 하는 예외. 그래서 체크 예외라고 불린다. 이 예외는 처리하지 않으면 컴파일할 수 없어서 컴파일 예외라고도 부른다. 이를 테면 ClassNotFoundException이나 IOException같은 것들이 체크 예외에 속한다. RuntimeException RuntimeException은 Exception을 상속받는 예외 클래스다. 프로그램 실행 중에 발생하는 에러를 런타임 예외라고 부르며 반드시 처리할 필요는 없다. 따라서 언체크 예외라고 부른다. 런타임 예외로는 흔히 볼 수 있는 NullPointerException이 있다. 컴파일하는 데에는 아무..

Java 2021.02.07

다이나믹 디스패치, 더블 디스패치

Static Dispatch public class Dispatch { static class Service { void run() { System.out.println("run().."); } } public static void main(String[] args) { new Service().run(); } } 이런 코드가 있다고 하자. 이 코드는 컴파일 시점에 Service클래스의 run메소드가 실행된다는 것을 이미 알고 있다. 컴파일된 바이트 코드에서도 그 정보를 확인할 수 있다. 이처럼 컴파일 시점에 이미 어느 클래스의 어느 메소드를 사용할지가 결정되는 것을 static dispatch라고 한다. 그럼 run()메소드가 오버로딩 되어 여러 개 존재하는 경우를 보자. public class Dis..

Java 2020.12.26

5주차 - 클래스, 생성자, 객체, this, 메소드

Class class public class { //클래스의 기본 형태 } 클래스에서 사용할 수 있는 접근 제어자 일반적으로 사용하는 클래스의 접근제어자는 public이고 원한다면 default제어자를 사용할 수 있다. 그외 protected나 private은 클래스 앞에 선언할 수 없다. default 는 가능한데 protected는 사용할 수 없게 제한하는 이유가 무엇인지는 잘 모르겠다. 반면에 private을 클래스의 접근제어자로 사용할 수 없는 이유는 분명해 보인다. 객체 지향 세계에서는 "어떤 객체도 섬이 아니다" 객체지향이란 결국 객체들끼리 협업을 하는 것이다. private을 붙여서 클래스를 만든다는 것은 객체를 지향하지 않고 객체를 섬으로 만들겠다는 거나 다름 없다. final class ..

Java 2020.12.19

4주차 - 제어문

https://github.com/whiteship/live-study/issues/4 제어문 제어문이란 말 그대로 코드를 '제어'해야 할 때 쓴다. 이를테면 어떤 조건(if-else/switch)에 따라 다르게 동작해야 할 때라든가, 같은 코드를 반복(loop)해야 할 때 쓰는 문(statement)을 제어문이라고 한다. 조건문(if-else) if-else문의 기본 문법 if(조건식) { //조건에 맞을 때 수행할 문장 } else { //조건에 맞지 않을 경우 수행할 문장(생략 가능) } 조건식의 결과는 반드시 boolean타입(true/false)이어야 한다. if - else if문 if의 조건식이 맞지 않을 때 다른 조건식을 충족하는지 확인할 때 사용하는 것이 else if절이다..

Java 2020.12.11

자바 람다식(Java Lamda Expression)

github 람다식(LamdaExpression) 람다식은 익명 클래스와 동등한 기능을 하는 식(Expression)이다. 간단한 식만으로 익명 클래스의 거추장스러움을 벗어날 수 있다. 익명 클래스 new Object() { public void print(String msg) { System.out.println(msg); } } 람다식 msg -> System.out.println(msg);위 코드는 람다를 보여주기 위한 간단한 예시일 뿐, 실제로 저 print()를 호출할 수는 없다. 요점은 람다식을 이용하면 훨씬 간결해진다는 것이다. 람다식을 사용하기 위해서는 람다식과 동등한 추상메서드가 선언된 인터페이스가 필요하다. 여기서 '동등하다'는 것은 추상메서드와 람다식의 매개변수와 반환타..

Java 2020.10.29

Java - 단순 연결 리스트 구현하기

모든 코드는 github LinkedList LinkedList는 요소와 요소 간 연결link을 이용해서 List를 구현한다. 중요한 것은 연결은 무엇인가를 파악하는 것이다. 반대로 무엇이 연결이 아닌가, 를 생각해보는 것도 의미가 있을 것이다. ArrayList는 배열을 이용하므로 요소와 요소가 딱 붙어있다. 비유하자면 일렬로 줄 서 있다고 할 수 있다. LinkedList는 그렇지 않다. LinkedList의 요소들은 각각 어딘가에 흩어져 있고, 각 요소는 다음 요소가 어디 있는지에 대한 정보만 가지고 있다. ArrayList는 원하는 데이터가 몇 번 인덱스에 있는 줄만 알면 바로 접근할 수 있다. 반면 LinkedList는 첫 번째 요소에게 다음 요소의 위치를 묻고, 두 번째 요소에게 세 번째 요소..

자료구조 2020.10.17

선택정렬SelectionSort

선택정렬 SelectionSort 전체 코드 package com.algorithm; import java.util.Arrays; public class SelectionSort { /** * 배열 array와 array의 두 인덱스(i, j)를 매개변수로 받아서 * i번 인덱스와 j번 인덱스에 저장된 요소를 바꾸는 메소드 */ public static void swapElements(int[] array, int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } /** * 배열 array와 start값을 매개변수로 받는다. * array[]의 start번째 인덱스부터 시작하여 마지막 인덱스까지 반복하면서 * 가장 작은 값이..

알고리즘 2020.10.08

알고리즘

? 상수시간constant time 실행 시간이 입력 크기에 의존하지 않으면 알고리즘은 상수 시간constant time을 따른다고 한다. 이를테면, n개의 배열에서 브래킷 연산([])을 사용하여 요소 중 하나에 접근할 때 이 연산은 배열의 크기와 관계 없이 같은 수의 동작을 한다. ? 선형linear 실행 시간이 입력 크기에 비례하면 알고리즘은 선형linear이라고 한다. 배열에 있는 요소를 더한다면 n개 요소에 접근하여 n-1번 더하기 연산을 해야 한다. 연산 요소(요소 접근과 더하기)의 총 횟수는 2n-1이고 n에 비례한다. ? 이차quadratic 실행시간이 n^2에 빌례하면 알고리즘은 이차quadratic라고 한다. 말하자면 리스트에 있는 어떤 요소가 두 번 이상 나타나는지를 알고 싶다고 하자...

알고리즘 2020.10.08

스프링이란?

스프링이라는 프레임 워크 image 🌍Wikipedia 프레임워크의 사전적 의미는 뼈대, 근간이다. 이까짓 뼈대가 왜 필요하나? a,b,c, ...z가 함께 일하는데 모두가 다른 방식으로 일한다면 어떨까? 뭐 그럭저럭 흘러는 가겠지만... 지금은 상상할 수 없는 어떤 무시무시한 일들이 벌어질지도 모르겠다. a와 w가 밤새 개발한 다음, 이제 우리 코드를 합쳐 보자! 했을 때, a의 방식과 w의 방식이 전혀 달라서 대략난감한 경우 말이다. 흠. 이렇게 하자고 했잖아! 난 이게 더 좋단 말이야! 이런이런. 프레임워크는 독재차처럼 흐름을 제어한다. 개발자는 프레임워크가 제어하는 흐름을 따라 개발할 수밖에 없다. 위에서 예로든 a부터 z로 이루어진 알파벳 팀 모두가 Spring을 쓴다고 해보자. 그럼 a와 w는..

Spring legacy 2020.09.12