Java

    상속 정의 / 상속이 갖는 단점들은 무엇인가요?

    📝느낀 점 상속에 대해 '스프링 입문을 위한 자바 객체 지향의 원리와 이해' 라는 책을 읽고 나의 잘못된 생각들을 바로 잡았던 계기가 되었다. 객체 지향의 상속은 일반인들의 생각하는 상속과는 개념이 다르다는 것이다. 솔직히 말하면 이부분에 대해서도 나는 지금까지 상속이니깐 일반인들의 상속을 연상시켜 생각하면 되겠지하며, 일반인들의 상속과 같게 생각하고 있엇던 것 같다. 그렇게 나또한 지금까지 상속 관계를 설명하면 "부모 - 자식 관계"라고 설명하고 다녔다. 하지만 이젠 이렇게 말하고 다니지 않는다. 제대로 된 표현은 "상위 클래스 - 하위 클래스" ,"슈퍼 클래스 - 서브 클래스" 등등 이렇게 말해야 되는 것이다. 부모 - 자식 관계를 생각해보자면 맨위 클래스에 "할아버지" 그 밑에 "아버지" 그밑에 자..

    인터페이스는 상수 필드만 선언이 가능한 이유는?

    📝느낀 점 인터페이스 또한 클래스랑 같은 파일이라고 생각하고 객체 생성이 가능한거 아냐? 생각했다. (물론 문법 공부할때 객체 생성은 클래스로! 라는 것은 알고 있었다. 하지만 궁금증이 생겨서 그런것) 근데 왜? 인터페이스에서는 객체 생성을 왜 하지 않지? 이런 궁금증이 생겼고, 해답을 찾아낸 지금은 좀 부끄럽기도 하고, 이래서 깊이 공부해야 된다는 거구나 느끼게 된 것 같다. 뭐든지 너무 당연하게만 생각하고 넘어가면 큰일난다! 가장 중요한 것은 인터페이스는 클래스와 다르다는 점이다. 자바 인터페이스는 추상적인 형태를 가지고, 구체적인 구현을 제공하지 않기 때문이다. 인터페이스의 목적은? 클래스에게 특정 메서드의 구현을 강제하고, 서로 다른 클래스가 공통의 동작을 보장하기 위한 것이다. 궁금증. 인터페이..

    왜 모든 클래스는 Object 클래스의 상속을 받을까?

    📝느낀 점 자바에서 모든 클래스의 부모는 object라는 사실은 '자바의 정석' 책에서 봤었다. 개발자 명시하지 않을 뿐 컴파일러가 바이트코드(.class) 만드는 과정에서 상속을 넣어주는 개념이라고 알고 있다. "그런데, 왜? 뭘 받기 위해서?" 이런 고민을 하게 되었고, 이부분에 대해 공부를 하게 되었다. 가장 큰 이유는, Object 클래스에 있는 메소드들을 통해서 클래스의 기본적인 행동을 정의할 수 있기 때문인 것이다. 즉, 자바는 객체지향 프로그래밍이기에 원칙 중 상속과 다형성이 있기 때문인것 같다. 이러한 설계를 함으로써 이점은 뭘까? 표준화된 메서드 Object 클래스에는 모든 객체에서 공통적으로 사용되는 메서드가 정의되어 있다. 예를 들어, toString(), equals(), hashC..

    실행을 위해서 왜 main 메서드가 필요한 것인가요?

    📝느낀 점 당연히 자바는 main() 메서드를 작성해야 동작한다는 룰이 있는 거겠지 하며, "그런가 보다" 하고 넘기기만 했다. 하지만 이런 생각은 개발자로서 위험하겠다는 생각을 하였고, 다시 자바에 대해 하나하나 찾아보고 기록을 남기려고 한다. main() 메서드를 작성 함으로써 자바 프로그램의 진입점을 알려주는 것과 같은 것이다. 그리고 String [] args는 프로그램 실행 시 JVM이 String 배열을 생성하여 매개변수로 전달한다는 사실도 알게 되었다. 왜, 실행을 위해서 main 메서드가 필요한 것인가요? 이유는 프로그램이 실행되는데에 있어서 자바 프로그램의 진입점은 main() 메소드이기 때문에 반드시 있어야 한다는 것입니다. 즉, 자바는 main 메서드를 프로그램 실행의 시작 기점으로 ..

    System.out.println() 내부 동작원리

    📝느낀 점 평소엔 그냥 콘솔에 출력만 했었지, 정확히 어떤 내부 동작인지 모르고 사용해 왔다. 그렇기에, 이번 기회에 내부 동작이 어떤지? 알게되어 좀 더 명확해 졌다는 생각이 들었다. out 이라는 클래스 변수와 println()이라는 메서드 모두 static으로선언되어 있기 때문에, 나는 별도의 클래스 객체 생성 필요 없이 사용할 수 있었던 것이다. public class Main { public static void main(String[] args) { System.out.println("Hello"); } } System은 java.lang 패키지에 속하는 클래스다. java.lang 패키지는 컴파일 단계에서 암묵적으로 import java.lang.* 를 추가 해준다. 따라서, java.lan..