Reflection API를 찾게 되기까지 Reflection API는 Spring 프레임워크를 다루며 종종 접한다. 필자도 Spring 프레임워크에서 쓰이는 JPA를 공부하다가 이 Reflection API를 공부하게 되었다. 이 글에서는 이것이 무엇인지, 왜 존재하는지 간단히 알아보자. Reflection API는 구체적인 클래스 타입을 알지 못해도 그 클래스의 정보(메서드, 타입, 변수 등등)에 접근할 수 있게 해주는 자바 API이다. 위 정의가 잘 이해가 가지 않아도 좋다. 아래 예제를 계속 보자. 자바 다형성의 문제점 자바의 다형성 덕분에 아래와 같이, 부모/조상 객체 타입에 객체 생성이 가능하다. 하지만 문제는, 이렇게 obj라는 객체를 생성했을 때 Car 클래스만의 메서드를 사용할 수 없다...
자바에서 프로그래밍을 하다 보면 ==를 쓸 때도 있고, equals() 메서드를 쓰기도 한다. equals()는 메서드 형태이고 ==는 연산자 형태이기에, 형태가 다르다는 사실은 알고 있을 것이다. 이 둘의 기능적 차이는 무엇일까? 바로 주소를 비교하느냐, 대상의 내용 자체를 비교하느냐이다. == 연산자는 대상의 주소값을 비교하여 판단한다. equals() 메서드는 대상의 내용 자체를 비교하여 판단한다. 다음의 예제를 보자. String str1 = "hi"; String str2 = new String("hi"); System.out.println(str1.equals(str2)); // true System.out.println(str1 == str2); // false 여기에서 str1, str2의..
스프링 컨테이너와 ApplicationContext // 스프링 컨테이너 생성 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); ApplicationContext를 스프링 컨테이너라고 한다. ApplicationContext는 인터페이스다. (위 코드에서 AnnotationConfigApplicationContext는 ApplicationContext의 구현체인 것이다.) 스프링 컨테이너는 XML을 기반으로 만들 수도 있고, 애노테이션 기반의 자바 설정 클래스로도 만들 수 있다. 위 코드가 애노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든 것이다. 참고) 더 정확히는 스프..
좋은 객체 지향 설계를 위해서는 다형성 뿐만 아니라 SOLID도 알아야 한다. 가끔 악덕 면접관들은 이 SOLID가 무엇이냐고 물어보기도 한다. 그럼 대체 이 SOLID는 무엇인가? SRP, OCP, LSP, ISP, DIP의 앞 글자를 딴 것이다. 아직 이해가 안 되는 것이 당연하다. 각각이 뭔지 세세히 알아보자. SRP (Single Responsibility Principle) 단일 책임 원칙 한 클래스는 하나의 책임만 가져야 한다. 허나 여기서 하나의 책임이라는 것은 문맥과 상황에 따라 다르므로 객관적으로 평가하는 것이 쉽지 않다. 중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것이다. 예를 들어 UI를 변경하는데 SQL 코드부터 서버 전반에 걸쳐 고쳐야 ..
객체 찾기 - 온라인 쇼핑몰에 회원 로그인을 하고 여러 판매자가 판매하고 있는 제품 중 하나를 골라 주문한다 - 아침에 회사 가는 길에 별다방 커피숍에 들러 아이스 카페라떼를 주문했다 - 성적 확인을 위해 학사 관리 시스템에 로그인하여 수강한 과목들의 성적을 확인했다 (학생, 과목, 교수, 강의실, 통계자료, 성적 산출 방법) 클래스는 객체의 청사진(blueprint) - 객체의 속성은 클래스의 멤버 변수(member variable)로 선언 - 학생 클래스 public class Student { int studentNumber; String studentName; int majorCode; String majorName; int grade; } - 주문 클래스 public class Order{ in..
객체 (object) - 의사나 행위가 미치는 대상 (사전적 의미) - 구체적, 추상적 데이터의 단위 (학생, 회원, 생산, 주문, 배송) 객체 지향 프로그래밍과 절차 지향 프로그래밍 - 아침에 일어나 학교를 가는 과정을 예를 들어 봅시다. - 절차 지향 프로그래밍 (C) 시간이나 사건의 흐름에 따른 프로그래밍 일어난다 -> 씻는다 -> 밥을 먹는다 -> 버스를 탄다 -> 요금을 지불한다 -> 학교에 도착 - 객체 지향 프로그래밍 (C++, C#, Python, JavaScript ..) 학생 밥 학생 버스 학생 학교 객체 지향 프로그래밍의 구현 방법 1. 객체 정의 후 2. 각 객체가 제공하는 기능들을 구현하고 3. 각 객체가 제공하는 기능들 간의 소통(메세지 전달)을 통하여 객체 간의 협력 구현
국어 사전에서는 객체가 위 사진처럼 '의사나 행위가 미치는 대상'이라고 나온다. 우리 주위에는 사람, 노트북, 버스 등의 객체가 있다. (눈에 보이지 않는 것도 객체가 될 수 있다. 예를 들어 주문, 생산, 관리 등) 객체 지향 프로그래밍은 OOP(Objected-Oriented Programming)이라고도 하며, 객체를 기반으로 프로그램을 짜는 것이다. 즉, 어떤 대상을 가지고 프로그래밍하는 것이다. 자바는 이러한 객체 지향 언어이다. 아래에서 더 자세히 살펴보자. 우리는 아침에 일어나 학교에 가기까지 여러 일을 한다. 침대에서 일어난 후, 씻고, 밥을 먹고, 걸어서(혹은 버스나 차를 타고) 학교에 도착한 후 수업을 준비한다. 이런 식으로 '순서대로 일어나는 일을 시간 순으로 프로그래밍하는 것'을 '..
자바 소스 코드를 실행하는 과정에서 컴파일러는 자바 소스코드를 이용해 클래스 파일을 생성한다. 그런데 C와 같은 언어에서는 최종으로 exe 파일을 생성한다. ( 이 exe 파일은 단순히 더블클릭으로 실행시키기만 하면 작동된다. ) 자바에서는 왜 실행하기도 어려운 클래스 파일을 만드는 걸까? 먼저, C와 C++같은 언어에서는 컴파일된 실행 파일을 모든 운영체제에서 동일하게 사용 불가능하다. 윈도우에서 컴파일한 실행 파일을 리눅스에서 사용할 수 없다는 이야기다. 하지만 자바에서는 JVM이라는 중간단계 역할을 수행하는 것이 있기 때문에, 한번 작성해 컴파일한 파일은 어떤 운영체제에서든 사용 가능하다. ( 자바는 JVM으로 이러한 장점이 생겼지만, 반대로 C와 같은 언어에서는 없는 중간 단계가 자바에는 있어..
instanceof 연산자 : 객체의 타입을 확인하는 연산자 참조변수 instanceof 클래스명 클래스 : 객체를 만들기 위한 프레임 (앞 글자가 대문자) public class InstanceofEx { public static void main(String[] args) { String s = "Hello"; int i = 3; float f = 3.14f; double d = 3.14; char c = 'a'; System.out.println(s instanceof String); System.out.println(Integer.valueOf(i) instanceof Integer); System.out.println(Float.valueOf(f) instanceof Float); System...
비트 연산자 : 비트 단위로 연산을 하는 연산자 비트(Bit) : 데이터의 최소 단위 0101 0101 1111 0000 1010 각각의 자릿수(단위)를 비트라고 한다. 각각의 자릿수가 8개가 모이면 1Byte가 된다. ( 0은 거짓, 1은 참 ) -비트 논리연산자 종류 연산자 사용 예시 설명 비트AND & a&b 둘다 1이면 1 비트OR | a|b 둘중 하나만 1이어도 1 비트XOR ( eXclusive ) ^ a^b 서로 다르면 1, 같으면 0 비트NOT ~ ~a 1이면 0, 0이면 1 -비트 쉬프트연산자 쉬프트 연산 = 비트 이동 연산 종류 연산자 사용 예시 설명 왼쪽 쉬프트 > n a의 비트를 오른쪽으로 n만큼 이동 왼쪽 쉬프트 연산자 : 왼쪽 1칸씩 이동할 때마다 *2하는 효과 오른쪽 쉬프트 연..
상수 : 항상 유지되는 수 (변하지 않는 수) 변수의 상수화 : 변수에 저장된 값을 변경하지 않고 상수처럼 사용함 변수를 상수화시키면 초기화 이후 값을 바꿀 수 없다. 상수화 방법 final 자료형 변수명 = 값; 상수의 변수명은 모든 글자를 대문자로 쓰는 게 좋다. 개발자들 간의 예의이자 약속 public class Prca { public static void main(String[] args) { int a = 3; a = 4; // 변수이니 가능 final double PI = 3.14; PI = 3.15; // 상수이니 불가능 } }
형변환 : 변수나 상수의 데이터 타입을 다른 타입으로 변환하는 것 형변환의 종류 - 자동 형변환 (묵시적 형변환) : 자동으로 타입이 변환되는 것 - 강제 형변환 (명시적 형변환) : 코드 상 강제로 형식을 변환시키는 것 강제형변환 방법 (자료형)변수명; public class DataType { public static void main(String[] args) { int a = 65; float f = a; // 자동형변환 System.out.println(f); char c = (char)a; // 강제형변환 (명시적 형변환) System.out.println(c); // 참고 // 컴퓨터는 문자를 저장할 수 없다 // 따라서 문자마다 고유한 숫자값을 부여했는데 // 그 숫자가 바로 문자의 아스키..
자료형 : 자료(data)가 가질 수 있는 정수, 실수, 문자 논리 등 형식 자료형 바이트(Byte) 예시 정수형 int, long, short 4, 8, 2 1, 0, -1, 2, 100 실수형 float, double 4, 8 3.14f, 3.14 문자형 char 2 'a', 'A' 문자열 String (문자열 길이에 따라 달라짐) "hello", "A" 논리형 boolean 1 true, false public class VarTest { public static void main(String[] args) { // 정수형 변수 int i = 100; // 실수형 변수 float f = 3.14f; double d = 3.14; // 문자형 변수 char c = 'a'; // 문자열 변수 Strin..