로버트 마틴은 클린 소프트웨어라는 책에서 소프트웨어 모듈이 가져야 하는 세 가지 기능에 관해 설명한다. 여기서 모듈이란 크기와 상관없이 클래스나 패키지, 라이브러리와 같이 프로그램을 구성하는 임의의 요소를 의미한다. 모든 소프트웨어 모듈에는 세 가지 목적이 있다. 첫 번째 목적은 실행 중에 제대로 동작하는 것이다. 이것은 모듈의 존재 이유라고 할 수 있다. 두 번째 목적은 변경을 위해 존재하는 것이다. 대부분의 모듈은 생명주기 동안 변경되기 때문에 간단한 작업만으로도 변경이 가능해야 한다. 변경하기 어려운 모듈은 제대로 동작하더라도 개선해야 한다. 모듈의 세 번째 목적은 코드를 읽는 사람과 의사소통하는 것이다. 모듈은 특별한 훈련 없이도 개발자가 쉽고 읽고 이해할 수 있어야 한다. 읽는 삶과 의사소통할 ..
1. takeWhile() takeWhile은 인자 값이 false라면 스트림을 중단하는 중간 연산자이다. 쉽게 생각하면 for문을 돌릴 때 break를 거는 것과 비슷하다. 이 연산자는 아래와 같이 많이 쓰인다. .takeWhile(Objects::nonNull) Objects.nonNull()은 인자값이 null이 아니면 true를 반환해준다. 예시를 들어서 아래 코드가 있다고 가정해보자. users.stream() .takeWhile(Objects::nonNull) users는 List 필드변수다. users를 돌면서 User 객체가 null이 아니면 돌다가, User 객체가 null인 순간 Objects.nonNull()에서 false를 리턴하고, false를 받은 takeWhile은 Stream..
객체 지향은 인간 지향이다. 프로그래밍 언어의 발전사를 보면 개발자를 더욱 편하고 이롭게 하기 위한 과정임을 알 수 있다. 기계어에서 어셈블리어, C, C++, 자바로 발전해 온 과정이 기계가 아닌 인간을 배려하기 위한 과정이었던 것이다. 하지만 객체 지향 전까지는 인간이 기계를 이해하려고 노력해야 하는 것에서 벗어나지 못했다. 그래서 "왜 우리가 기계 종속적인 개발을 해야 하는가?"라는 의문점에서 "현실 세계처럼 프로그래밍할 수 없을까?" 라는 고민을 했고, 객체지향의 개념이 탄생하였다. 우리가 주변에서 볼 수 있는 모든 것은 사물이다. 눈으로 보여지는 것도 사물, 손으로 만져지는 것도 사물, 머릿속으로 어떤 것을 상상할 때도 사물을 떠올린다. 이 사물을 멋진말로 객체, 영어로는 Object라고 한다...
자바 프로그램의 개발과 구동 우리는 컴퓨터를 구동하기 위해서는 컴퓨터, 즉 하드웨어와 운영체제, 그리고 그 위에서 구동될 소프트웨어가 필요하다. 그리고 소프트웨어를 개발할 수 있는 개발 도구가 필요하다. 자바는 이러한 과정을 그대로 모방하고 있다. 현실세계 자바 월드 소프트웨어 개발 도구 JDK(Java Development Kit) 운영체제 JRE(Java Runtime Enviorment) 하드웨어(컴퓨터) JVM(Java Virtual Machine) 현실 세계에서 프로그램을 실행하려면 개발 도구로 프로그램을 개발하고, 운영체제를 통해 하드웨어에 구동시킨다. 자바 월드도 마찬가지다. JDK를 이용해 개발된 프로그램을 JRE를 통해서 JVM에서 구동된다. 다음으로 알아볼 것은 자바의 메모리 사용방식이..
아래는 DB에 저장된 게시글을 다 꺼내서 List로 조회하는 로직이다. 이것을 스트림을 이용하면 단 3줄로 줄일 수 가 있다. 위 코드에서는 스트림의 map과 collect, 람다의 메서드참조를 사용하였다. 어떻게 첫번째 사진이 두번째 사진으로 될 수 있는지 파헤쳐보자. stream 먼저 boardRepository.findAll()은 DB에 있는 게시글들을 List형태로 리턴해준다. 여기에 .stream()을 붙여서 스트림을 얻었다. 이렇게 게시글 리스트에다가 stream 메서드를 호출함으로써 map, filter, limit, collect 등 데이터 처리 연산을 할 수 있게 된다. map 람다를 이용해서 한 요소를 다른 요소로 변환하거나 정보를 추출해준다. 위 코드에서는 람다의 메서드 참조를 이용해..
전통적인 자바에서 인터페이스와 관련 메서드는 한 몸처럼 구성된다. 인터페이스를 구현하는 클래스는 인터페이스에서 정의하는 모든 메서드 구현을 제공하거나 슈퍼클래스의 구현을 상속받아야 한다. 예를 들어보자. CRUD의 추상메서드를 가지고 있는 인터페이스가 있다. 그리고 위 인터페이스를 구현하는 클래스는 인터페이스에서 정의하는 모든 메서드 구현을 제공하거나 슈퍼클래스의 구현을 상속받아야 한다. 그렇게 하지 않으면 오류가 뜰 것이다. 평소에는 이 규칙을 지키는 데 아무 문제가 없지만 라이브러리 설계자 입장에서 인터페이스에 새로운 메서드를 추가하는 등 인터페이스를 바꾸고 싶을 때는 문제가 발생한다. 위 예제를 다시 들어 나는 CRUD 인터페이스를 설계한 설계자이다. 어느 날 나는 CRUD 인터페이스에 제목으로 검..
1. 사람들이 Optional 쓰는 방법 Optional이 나온 이유부터 알아보자. 이유를 모르고 쓰는 사람들은 이렇게 말한다. "null을 반환하면 그 무서운 NPE가 뜨기 때문에, Optional로 null을 가지는 변수, 또는 객체를 Optional로 묶어요. 그럼 NPE가 안떠요" 자바로 개발하면서 한 번이라도 NullPointerException을 겪은 사람은 손을 들어보자. NPE는 다양한 예외 중에서도 가장 악질로 유명한 예외이다. 그렇기에 NPE를 피하기 위해서 Optional을 사용하는 사람은 드물지 않을 것이다. 하지만 당연히 Optional이 나온 이유는 NPE를 피하기 위함이 아니다. 그럼 NPE가 얼마나 무섭길래 Optional을 쓰는 이유를 모르면서까지 Optional을 쓰며 피..
학교 네트워크 프로그래밍 실습 수업이나 인강을 들을 때 원하는 로직을 짜고 빨간줄이 그어져있는 구문에 try-catch문이나 메서드에 throws를 날려줌으로써 예외처리를 하는 것을 많이 봤다. 하지만 이해가 되지 않았다. 예외 처리의 정의는 프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것인데, 그럼 처음부터 빨간줄이 그어져있을 때 정상적으로 작동하는 로직으로 다시 바꾸면 되지 않나? 라고 생각했다. 내 말은 모든 경우의 수(혹시 모를 오류)를 대비하는 것 보단 처음부터 완성된 로직을 짜면 되지 않을까 ? 라는 생각이었다.(여기서 말하는 오류는 RuntimeException클래스들 이다) 하지만 책을 조금만 읽어봐도 내 의문에 대한 답을 찾을 수 있었다. 오늘은 예..
1. 추상클래스란 ? 클래스를 설계도에 비유한다면, 추상클래스는 미완성 설계도에 비유할 수 있다. 클래스가 미완성이라는 것은 멤버의 개수에 관계된 것이 아니라 미완성 메서드(추상메서드)를 포함하고 있다는 의미이다. 추상클래스는 인스턴스를 생성할 수 없으며, 상속을 통해 자손클래스에 의해서만 완성될 수 있다. 한마디로 일반클래스에서 추상메서드를 포함한 클래스를 추상클래스로 부른다. 추상클래스는 새로운 클래스를 작성하는데 있어서 바탕이 되는 조상클래스로서의 중요한 의미를 갖는다. 아무것도 없는 상태에서 새로운 클래스를 만드는 것보다는 어느 정도 틀을 갖춘 상태에서 시작하는 것이 나을 것이다. 2. 추상 클래스 작성 방법 추상클래스는 abstract를 붙이기만 하면 된다. 이렇게 함으로써 이 클래스를 사용하려..
객체지향개념에서 중요한 특징 중 하나인 다형성에 대해서 알아보겠다. 다형성은 상속과 깊은 관계가 있어 상속에 대해 충분히 알고 있어야 한다. 1. 다형성이란 ? 프로그램적으로 말하자면 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하는 것이다. 2. 다형성의 조건 사실 다형성에 조건은 없지만 허용되는 것과 허용되지 않는 것들이 있다. 조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있다. 자손 타입의 참조변수로 조상타입의 인스턴스를 참조할 수 없다. 참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 한다. 이 세가지는 알고보면 다 같은 말이다. 참조변수가 사용하는 멤버의 개수가 인스턴스 멤버 개수보다 많다고 했을 때, 인스턴스 멤버에는 존재하지 ..
- Total
- Today
- Yesterday