생성자 - 필요한 이유객체를 생성하는 시점에 어떤 작업을 하고 싶다면 생성자(Constructor)를 이용하면 된다.생성자를 알아보기 전에 먼저 생성자가 왜 필요한지 코드로 간단히 알아보자.public class MemberInit { String name; int age; int grade;}public class MethodInitMain1 { public static void main(String[] args) { MemberInit member1 = new MemberInit(); member1.name = "user1"; member1.age = 15; member1.grade = 90; MemberInit me..
절차 지향 프로그래밍 1 - 시작절차 지향 프로그래밍 vs 객체 지향 프로그래밍 절차 지향 프로그래밍절차 지향 프로그래밍은 이름 그대로 절차를 지향한다. 쉽게 이야기해서 실행 순서를 중요하게 생각하는 방식이다.절차 지향 프로그래밍은 프로그램의 흐름을 순차적으로 따르며 처리하는 방식이다. 즉, "어떻게"를 중심으로 프로그래밍한다. 객체 지향 프로그래밍객체 지향 프로그래밍은 이름 그대로 객체를 지향한다. 쉽게 이야기해서 객체를 중요하게 생각하는 방식이다.객체 지향 프로그래밍은 실제 세계의 사물이나 사건을 객체로 보고, 이러한 객체들 간의 상호작용을 중심으로 프로그래밍하는 방식이다. 즉, "무엇"을 중심으로 프로그래밍한다. 둘의 중요한 차이절차 지향은 데이터와 해당 데이터에 대한 처리 방식이 분리되어 있다. ..
기본형 VS 참조형 1 - 시작자바에서 참조형을 제대로 이해하는 것은 정말 중요하다. 변수의 데이터 타입을 가장 크게 보면 기본형과 참조형으로 분류할 수 있다. 사용하는 값을 변수에 직접 넣을 수 있는 기본형, 그리고 이전에 본 Student student1과 같이 객체가 저장된 메모리의 위치를 가리키는 참조값을 넣을 수 있는 참조형으로 분류할 수 있다.기본형(Primitive Type): int, long, double, boolean처럼 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입을 기본형이라 한다.참조형(Reference Type): Student student1, int[] students와 같이 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입을 참조형이라 한다. 참조형은 객체 ..
클래스가 필요한 이유자바 세상은 클래스와 객체로 이루어져 있다. 그만큼 클래스와 객체라는 개념은 중요하다. 우선 클래스와 객체라는 개념이 왜 필요한 지부터 시작해서 클래스가 어떤 방식으로 발전하면서 만들어졌는지 점진적으로 알아보려고 한다. 예시 코드로 이해public class ClassStart1 { public static void main(String[] args) { String student1Name = "학생1"; int student1Age = 15; int student1Grade = 90; String student2Name = "학생2"; int student2Age = 16; int student2Grad..
주제가 HTTP인데 왜 네트워크를 공부해야 할까? :결국 웹이나 HTTP도 전부 인터넷 네트워크망 기반에서 동작을 한다. HTTP를 공부하기 위해 아래의 목차로 간단하게 네트워크에 대해 다뤄보겠다. 인터넷 통신 IP(Internet Protocol) TCP, UDP PORT DNS 인터넷 통신 컴퓨터 두대가 바로 옆에 붙어있다면 서로 케이블을 연결해서 통신할 수 있을 것이다. 하지만 보통의 경우에는 통신해야 하는 컴퓨터가 멀리 있을 것이다. 그렇다면 인터넷을 통해 통신해야 하는데 아주 복잡한 인터넷 망을 통해 어떻게 도착지에 잘 도착할 수 있을까? ➜ 그것을 이해하려면 IP(인터넷 프로토콜)에 대해 알아야 한다. IP(인터넷 프로토콜) 도착지를 가려면 최소한의 규칙이 필요하다. 도착지를 가려면 주소를 알..
변수 코틀린에는 강력한 타입추론(type inference) 기능이 있다. 변수의 타입을 명시해도 되지만, 생략하고 컴파일러가 추론하도록 해도 된다. 코틀린은 불변 변수 val 사용을 권장하고 있다. 불변 변수는 한 번 선언하고 나면 값을 변경할 수 없다. fun main() { var a: String = "first" println(a) a = "sec" println(a) val b: Int = 1 val c = 3 } // 실행 결과 first sec 변이 변수 var a를 선언하면서 초기화를 해주었다. a에 새로운 String 값을 할당할 수 있다. 불변 변수 val를 선언하고 초기화하고, 타입 선언은 생략할 수도 있다. 컴파일러가 3을 보고 Int 타입으로 추론을 한다. fun main() {..
중위 함수 Infix Functions 파라미터를 하나만 받는 멤버 함수나 확장(extension) 함수는, 해당 함수를 "중위 함수"형태로 쓸 수 있다. fun main() { infix fun Int.times(str: String) = str.repeat(this) println(2 times "Bye ") val pair = "자바" to "코틀린" println(pair) infix fun String.onto(other: String) = Pair(this, other) val myPair = "자바" onto "코틀린" println(myPair) val a = Person("A") val b = Person("B") a likes b } class Person(val name: String..
소개대용량 서버를 구축하기 위해서는 어떤 것들을 알아야 할까?Spring, MySQL, MongoDB, Redis, Kafka, MSA….서버 개발자의 핵심은 데이터다.대용량 시스템이 어려운 이유는 결국 많은 양의 데이터에서 시작된다. 어떻게 많은 양의 데이터를 안정적으로 삽입, 갱신, 조회할까?MySQL - 정규화, 인덱스, 트랜잭션, 동시성 제어MySQL에서는 이 4가지 키워드가 핵심이 된다. 대용량 시스템에 대한 이해웹의 기본 아키텍처웹 서버는 HTML, CSS, JavaScript와 같은 정적인 데이터들을 주로 서빙한다.웹 애플리케이션 서버는 데이터베이스에 저장된 데이터처럼 동적인 데이터들을 서빙한다. 웹 서버, 웹 애플리케이션 서버는 왜 나누어져 있을까?태초에는 웹 서버만 있는 형태에서 웹의 복..
코드를 보는 것만으로도 어떤 아키텍처인지 파악할 수 있다면 좋지 않을까? 새 프로젝트에서 가장 먼저 제대로 만들려고 하는 것은 패키지 구조다. 프로젝트에서 계속 사용할 괜찮아 보이는 구조를 잡는다. 그러고 나서 프로젝트가 진행될수록 점점 바빠지고 패키지 구조는 짜임새 없는 엉망진창 코드를 그럴싸하게 보이게 만드는 껍데기일 뿐이라는 점을 깨닫게 된다. 한 패키지에 있는 클래스들이 불러오지(import) 말아야 할 다른 패키지에 있는 클래스들을 불러오게 된다. 계층으로 구성하기 코드를 구조화하는 첫 번째 접근법은 계층을 이용하는 것으로서, 다음과 같이 구성할 수 있다. 여기서는 전에 봤듯이 domain 패키지에 AccountRepository 인터페이스를 추가하고, persistence 패키지에 Accoun..
계층형 아키텍처에 대해 불만만 늘어놓았으니 이번 장에서는 대안에 대해 이야기해 보자. 먼저 SOLID의 'S'와 'D'를 담당하는 단일 책임 원칙(SRP)과 의존성 역전 원칙(DIP)으로 시작한다. 단일 책임 원칙 '오로지 한 가지 일만 하는 것'은 단일 책임이라는 말을 가장 직관적으로 해석한 것이므로, 단일 책임 원칙을 자주 위와 같이 해석한다. 하지만 오해의 여지가 있다는 점에 주의해야 한다. '책임'은 사실 '한 가지 일만 한다'는 것보다는 '변경할 이유'로 해석해야 한다. 컴포넌트를 변경할 이유가 오로지 한 가지밖에 없다면 컴포넌트는 딱 한 가지 일만 하게 된다. 그리고 여기서의 초점은 변경할 이유가 오직 한 가지라는 것이다. 아키텍처에서는 컴포넌트를 변경할 이유가 한 가지라면 우리가 어떤 다른 ..