오버로딩이란? 자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다. 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩' 또는 '오버로딩(overloading)'이라 한다. 보통 하나의 메서드 이름에 하나의 기능만을 구현해야 하는데, 여러 기능을 구현하기 때문에 붙여진 이름이다. 오버로딩의 조건 메서드의 이름이 같아야 한다. 매개 변수의 개수 또는 타입이 달라야 한다. 위의 조건을 만족시키지 못하는 메서드는 중복 정의로 간주되어 컴파일 시에 에러가 발생한다. 오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 오버로딩을 구현하는데 아무런 영..
메서드 앞에 static이 붙어 있으면 클래스 메서드이다. 클래스 메서드도 클래스 변수처럼, 객체를 생성하지 않고도 '클래스이름.메서드이름(매개변수)'와 같은 식으로 호출이 가능하다. 반면에 인스턴스 메서드는 반드시 객체를 생성해야만 호출할 수 있다. static 메서드는 언제 사용할까? 클래스는 '데이터(변수)와 데이터에 관련된 메서드의 집합'이므로, 같은 클래스 내에 있는 메서드와 멤버 변수는 아주 밀접한 관계가 있다. 인스턴스 메서드는 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드이다. 반면에 메서드 중에서 인스턴스와 관계없는(인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드를 클래스 메서드(static 메서드)로 정의한다. 클래스를 ..
변수는 클래스변수, 인스턴스 변수, 지역 변수 총 세 종류가 있다. 변수의 종류를 결정짓는 중요한 요소는 '변수의 선언된 위치'이므로 변수가 어느 영역에 선언되었는지를 확인하는 것이 중요하다. 멤버 변수를 제외한 나머지 변수들은 모두 지역변수이며, 멤버 변수 중 static이 붙은 것은 클래스 변수, 붙지 않은 것은 인스턴스 변수이다. class Variables { int iv;//인스턴스 변수 static int cv;//클래스 변수(static변수, 공유변수) void method() { int lv = 0;//지역 변수 } } 인스턴스 변수(instance variable) 클래스 영역에 선언. 클래스의 인스턴스를 생성할 때 만들어짐. 인스턴스 변수의 값을 읽어 오거나 저장하기 위해서 인스턴스 생..
응용 프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도에 다라 여러 영역으로 나누어 관리한다. 메서드 영역(method area) 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스 파일(*. class)을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. 이때, 그 클래스의 클래스 변수(class varaible)도 이 영역에 함께 생성된다. 힙(heap) 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 인스턴스 변수들이 생성되는 공간이다. 호출 스택(call stack 또는 execution stack) 호출 스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되..
설계를 단순화하는 추상화(Abstrcation) 컴퓨터 설계자와 프로그래머는 자원의 수가 급격히 증가함에 따라 설계 시간이 길어지는 것을 방지하기 위해서 생산성을 높이기 위한 기술을 개발해야 했다. 하드웨어와 소프트웨어의 생산성을 높이기 위한 기술 중 하나는 여러 수준에서 설계를 명시하는 추상화(abstraction)를 사용하는 것이다. 하위 수준의 상세한 사항을 안 보이게 함으로써 상위 수준 모델을 단순화한다. 자주 생기는 일을 빠르게 자주 생기는 일을 빠르게 만드는 것이 드물게 생기는 일을 최적화하는 것보다 성능 개선에 도움이 된다. 아이러니하게도 자주 생기는 일은 드물게 생기는 일보다 단순하여 성능을 개선하기 쉬운 경우가 많다. 이 말은 자주 생기는 일이 무엇인지 미리 알고 있다는 것을 가정하고 있..
컴퓨터 응용 분야의 종류와 그 특성 스마트 가전제품이나 휴대전화에 내장되는 컴퓨터에서부터 초대형 슈퍼컴퓨터에 이르기까지 기본이 되는 하드웨어 기술은 같지만, 응용 분야에 따라서 설계 요구사항과 핵심적인 하드웨어 기술을 사용하는 방법은 각기 다르다. 개괄적으로 컴퓨터는 크게 세 가지 응용 분야에서 사용된다. 개인용 컴퓨터(Personal Computer, PC) 개인용 컴퓨터는 낮은 가격으로 단일 사용자에게 좋은 성능을 제공하는 것을 중요시하며 제 3자(third-party) 소프트웨어를 실행하기 위해 주로 사용된다. 서버(Server) 서버는 과거 대형 컴퓨터로 불리던 것의 현대적 형태로서 보통 네트워크를 통해서만 접근된다. 서버는 대개 대형 작업 수행에 이용된다. 대형 작업은 과학이나 공학 분야의 복잡..
AOP가 필요한 상황 모든 메서드의 호출 시간을 측정하고 싶을 때 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 회원 가입 시간, 회원 조회 시간을 측정하고 싶을 때 단순 측정 public Long join(Member member) { // 같은 이름이 있는 중복 회원X long start = System.currentTimeMillis(); try{ validateDuplicateMember(member); // 중복 회원 검증 memberRepository.save(member); return member.getId(); } finally { long finish = System.currentTimeMillis(); long timeMs = ..
H2 데이터베이스 웹 콘솔로 접근 https://www.h2database.com/html/download-archive.html h2 데이터베이스 설치 bin 폴더에서 h2.bat파일 실행 (window) 처음에 데이터베이스 파일을 만들어야 한다. 연결 화면 -> test.mv.db 파일이 생성된다. JDBC URL을 jdbc:h2:~/test처럼 접근하면 애플리케이션과 웹 콘솔이 동시에 접근하면 오류가 발생할 수 있다. JDBC URL을 jdbc:h2:tcp://localhost/~/test와 같이 바꿔서 연결한다. 파일에 직접 접근하는 것이 아니라 소켓을 통해서 접근하면 여러 군데서 접근할 수 있다. 테이블 생성 generated by default as identity -> 값을 정하지 않고 in..
홈 화면 추가 package hello.hellospring.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HomeController { @GetMapping("/") public String home() { return "home"; } } controller 패키지에 HomeController 생성 Hello Spring 회원 기능 회원 가입 회원 목록 resources/templates 에 home.html 작성 동작 원리 localhost:8080 호출 -> HomeController에..
직접 스프링 빈 등록하기 @Service, @Repository를 지우고 실행 -> 에러 발생 service 패키지에 SpringConfig 클래스 생성 package hello.hellospring.service; import hello.hellospring.repository.MemberRepository; import hello.hellospring.repository.MemoryMemberRepository; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class SpringConfig { @Bean p..
회원 서비스가 실행되기 위해서 MemberController가 MemberService를 통해서 회원 가입하고 MemberService를 통해서 데이터(MemberRepository)를 조회할 수 있어야 한다. 이렇게 한 객체가 다른 객체를 사용할 때 의존성이 있다고 한다. 회원 서비스를 제대로 동작시키기 위해서 Controller와 Service에 대한 의존성을 주입해야 한다. 의존성 주입(Dependecy Injection, DI) 의존성 주입(DI)란 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴으로, 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 다이나믹하게 주입하는 것이다. DI의 장점은 유연성을 확보하고 결합도를 낮출 수 있게 해 준다. ..
비즈니스 요구사항 정리 회원 도메인과 리포지토리 만들기 회원 리포지토리 테스트 케이스 작성 회원 서비스 개발 회원 서비스 테스트 비즈니스 요구사항 정리 데이터 : 회원 ID, 이름 기능 : 회원 등록, 조회 데이터 저장소가 선정되지 않음. 일반적인 웹 애플리케이션 계층 구조 컨트롤러 : 웹 MVC의 컨트롤러 역할 서비스 : 핵심 비즈니스 로직 구현 리포지토리 : 데이터베이스 접근, 도메인 객체를 DB에 저장하고 관리 도메인 : 비즈니스 도메인 객체 ex) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨 클래스 의존관계 아직 데이터 저장소가 선정되지 않아서, 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계 데이터 저장소는 RDB, NoSQL 등등 다양한 저장소를 고민 중인 상황으로 가정..