Java 34

call by value

우연히 https://www.facebook.com/tobyilee/posts/10222585502760852 이 글을 읽고 지금까지 Call by reference와 Call by reference에 대해 잘못 알고 있었다는 사실을 알았다. 지금까지는 Java에서 call by value는 기본 타입 호출, call by reference는 그 외 모든 레퍼런스 타입을 호출할 때 사용한다고 알고 있었지만, 사실은 Java는 모두 call by value로 동작한다. call by reference에서 말하는 by reference와 Java에서 말하는 reference value는 다르다. Call by value가 뭔가? 함수가 호출되면 메모리에서 함수를 위한 임시 공간을 할당한다. Call by v..

Java 2022.09.14

왜 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

8주차 - 인터페이스

목표 자바의 인터페이스에 대해 학습하세요. 인터페이스 정의하는 방법 public interface Service { //final static 변수 //default 메소드 //public static 메소드 public abstract void show(); } 인터페이스는 상수(final static), 추상 메소드, default메소드, public static메소드 이 네 가지만 가지고 있을 수 있다. 자바9부터는 private메소드도 선언할 수 있게 되었다. 인터페이스에 선언된 모든 변수는 상수, default, static, private이 붙지 않은 메소드는 추상 메소드다. 따라서 final static이나 public abstract키워드는 생략 가능하다. 컴파일러가 자동으로 붙여준다. 인..

Java 2021.01.08

7주차 - package, import, classpath, 접근 제어자(access modifier)

목표 자바의 패키지에 대해 학습하세요. 학습할 것 (필수) package 키워드 import 키워드 클래스패스 CLASSPATH 환경변수 classpath 옵션 접근지시자 Package 패키지는 관련된 파일을 넣어둔 폴더와 비슷하다. 패키지란 관련된 클래스들을 묶어서 그룹화 해놓은 것을 하나의 패키지라고 한다. 폴더 안에서 또 관심사를 나누는 폴더가 있을 수 있는 것처럼, 패키지 안에 패키지가 존재할 수 있다. 이를 통해 큰 틀로 묶고, 점점 세분화 하는 방식으로 패키지를 나눌 수 있다. 패키지 안의 패키지는 마침표(.)로 구분한다. java.lang.String str; 패키지는 제공하는 것을 사용해도 되고 새롭게 정의해서 사용해도 된다. 패키지명은 소문자로 만들어서 클래스 이름과 구분할 수 있도록 하..

Java 2021.01.02

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

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

6주차 - 상속

상속(Inheritance) 상속. 상속에 대해 생각해보자. 먼 미래에 내가 누군가에게 무언가를 상속하게 된다고. 난 무엇을 상속해줄 수 있을까? 돈? 집? 거기까진 모르겠다. 아마 운이 좋다면 키보드 정도를 남기고 떠날 수도 있을 것 같다. 아무튼. 자바에서는 extends키워드를 이용하여 상속을 사용한다. extends라는 단어에서 알 수 있듯이 자바에서 상속은 곧 확장이다. 슈퍼 클래스가 가진 것들을 이용하여 더 큰 클래스를 만들 목적으로 상속을 사용한다. 상속은 클래스와 클래스 간에 이루어진다. 확장(extends)되어질 클래스를 슈퍼클래스, 상위클래스(또는 부모 클래스)라고 하고 확장하는 클래스를 서브클래스, 하위클래스(또는 자식 클래스)라고 한다. 현실세계는 이 사람 저 사람에게 상속 받을 수..

Java 2020.12.25

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