개발 기록/JAVA

개발 기록/JAVA

Reflection API가 무엇일까?

Reflection API를 찾게 되기까지 Reflection API는 Spring 프레임워크를 다루며 종종 접한다. 필자도 Spring 프레임워크에서 쓰이는 JPA를 공부하다가 이 Reflection API를 공부하게 되었다. 이 글에서는 이것이 무엇인지, 왜 존재하는지 간단히 알아보자. Reflection API는 구체적인 클래스 타입을 알지 못해도 그 클래스의 정보(메서드, 타입, 변수 등등)에 접근할 수 있게 해주는 자바 API이다. 위 정의가 잘 이해가 가지 않아도 좋다. 아래 예제를 계속 보자. 자바 다형성의 문제점 자바의 다형성 덕분에 아래와 같이, 부모/조상 객체 타입에 객체 생성이 가능하다. 하지만 문제는, 이렇게 obj라는 객체를 생성했을 때 Car 클래스만의 메서드를 사용할 수 없다...

개발 기록/JAVA

자바에서 equals()와 == 의 차이점

자바에서 프로그래밍을 하다 보면 ==를 쓸 때도 있고, 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의..

개발 기록/JAVA

[Spring] 스프링 컨테이너의 생성 | ApplicationContext

스프링 컨테이너와 ApplicationContext // 스프링 컨테이너 생성 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); ApplicationContext를 스프링 컨테이너라고 한다. ApplicationContext는 인터페이스다. (위 코드에서 AnnotationConfigApplicationContext는 ApplicationContext의 구현체인 것이다.) 스프링 컨테이너는 XML을 기반으로 만들 수도 있고, 애노테이션 기반의 자바 설정 클래스로도 만들 수 있다. 위 코드가 애노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든 것이다. 참고) 더 정확히는 스프..

개발 기록/JAVA

객체 지향 설계의 5원칙 SOLID | SRP, OCP, LSP, ISP, DIP

좋은 객체 지향 설계를 위해서는 다형성 뿐만 아니라 SOLID도 알아야 한다. 가끔 악덕 면접관들은 이 SOLID가 무엇이냐고 물어보기도 한다. 그럼 대체 이 SOLID는 무엇인가? SRP, OCP, LSP, ISP, DIP의 앞 글자를 딴 것이다. 아직 이해가 안 되는 것이 당연하다. 각각이 뭔지 세세히 알아보자. SRP (Single Responsibility Principle) 단일 책임 원칙 한 클래스는 하나의 책임만 가져야 한다. 허나 여기서 하나의 책임이라는 것은 문맥과 상황에 따라 다르므로 객관적으로 평가하는 것이 쉽지 않다. 중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것이다. 예를 들어 UI를 변경하는데 SQL 코드부터 서버 전반에 걸쳐 고쳐야 ..

개발 기록/JAVA

[JAVA] 객체 클래스로 구현

객체 찾기 - 온라인 쇼핑몰에 회원 로그인을 하고 여러 판매자가 판매하고 있는 제품 중 하나를 골라 주문한다 - 아침에 회사 가는 길에 별다방 커피숍에 들러 아이스 카페라떼를 주문했다 - 성적 확인을 위해 학사 관리 시스템에 로그인하여 수강한 과목들의 성적을 확인했다 (학생, 과목, 교수, 강의실, 통계자료, 성적 산출 방법) 클래스는 객체의 청사진(blueprint) - 객체의 속성은 클래스의 멤버 변수(member variable)로 선언 - 학생 클래스 public class Student { int studentNumber; String studentName; int majorCode; String majorName; int grade; } - 주문 클래스 public class Order{ in..

개발 기록/JAVA

[JAVA] 객체와 객체 지향 프로그래밍

객체 (object) - 의사나 행위가 미치는 대상 (사전적 의미) - 구체적, 추상적 데이터의 단위 (학생, 회원, 생산, 주문, 배송) 객체 지향 프로그래밍과 절차 지향 프로그래밍 - 아침에 일어나 학교를 가는 과정을 예를 들어 봅시다. - 절차 지향 프로그래밍 (C) 시간이나 사건의 흐름에 따른 프로그래밍 일어난다 -> 씻는다 -> 밥을 먹는다 -> 버스를 탄다 -> 요금을 지불한다 -> 학교에 도착 - 객체 지향 프로그래밍 (C++, C#, Python, JavaScript ..) 학생 밥 학생 버스 학생 학교 객체 지향 프로그래밍의 구현 방법 1. 객체 정의 후 2. 각 객체가 제공하는 기능들을 구현하고 3. 각 객체가 제공하는 기능들 간의 소통(메세지 전달)을 통하여 객체 간의 협력 구현

개발 기록/JAVA

[JAVA] 객체 지향 프로그래밍이란? | OOP

국어 사전에서는 객체가 위 사진처럼 '의사나 행위가 미치는 대상'이라고 나온다. 우리 주위에는 사람, 노트북, 버스 등의 객체가 있다. (눈에 보이지 않는 것도 객체가 될 수 있다. 예를 들어 주문, 생산, 관리 등) 객체 지향 프로그래밍은 OOP(Objected-Oriented Programming)이라고도 하며, 객체를 기반으로 프로그램을 짜는 것이다. 즉, 어떤 대상을 가지고 프로그래밍하는 것이다. 자바는 이러한 객체 지향 언어이다. 아래에서 더 자세히 살펴보자. 우리는 아침에 일어나 학교에 가기까지 여러 일을 한다. 침대에서 일어난 후, 씻고, 밥을 먹고, 걸어서(혹은 버스나 차를 타고) 학교에 도착한 후 수업을 준비한다. 이런 식으로 '순서대로 일어나는 일을 시간 순으로 프로그래밍하는 것'을 '..

개발 기록/JAVA

[JAVA] 자바 컴파일 결과가 exe가 아닌 class인 이유

자바 소스 코드를 실행하는 과정에서 컴파일러는 자바 소스코드를 이용해 클래스 파일을 생성한다. 그런데 C와 같은 언어에서는 최종으로 exe 파일을 생성한다. ( 이 exe 파일은 단순히 더블클릭으로 실행시키기만 하면 작동된다. ) ​ 자바에서는 왜 실행하기도 어려운 클래스 파일을 만드는 걸까? 먼저, C와 C++같은 언어에서는 컴파일된 실행 파일을 모든 운영체제에서 동일하게 사용 불가능하다. 윈도우에서 컴파일한 실행 파일을 리눅스에서 사용할 수 없다는 이야기다. 하지만 자바에서는 JVM이라는 중간단계 역할을 수행하는 것이 있기 때문에, 한번 작성해 컴파일한 파일은 어떤 운영체제에서든 사용 가능하다. ( 자바는 JVM으로 이러한 장점이 생겼지만, 반대로 C와 같은 언어에서는 없는 중간 단계가 자바에는 있어..

개발 기록/JAVA

[JAVA] instanceof 연산자 | 객체 타입 확인

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...

개발 기록/JAVA

[JAVA] 연산자 우선순위 | 우선순위 표

연산자 우선순위 연산자 최우선 연산자 [] () 단항 연산자 ! ~ + - ++ 산술 연산자 + - * / % 쉬프트 연산자 > 관계 연산자 == != 논리 연산자 && || 삼항 연산자 (조건) ? 참 : 거짓 대입 연산자 = += -=

개발 기록/JAVA

[JAVA] 비트 연산자 | BIT OPERATOR

비트 연산자 : 비트 단위로 연산을 하는 연산자 비트(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하는 효과 오른쪽 쉬프트 연..

개발 기록/JAVA

[JAVA] 문자열 비교 | 서로 같은 문자열인지 판단하기 | equals

public class StringCompare { public static void main(String[] args) { String s1 = "Hello JAVA!"; // s1 문자열 변수에 값 대입 System.out.println(s1 == "Hello JAVA!"); // true System.out.println(s1.equals("Hello JAVA!")); // true System.out.println(s1.equals("hello java!")); // false } } equals : String 문자열 클래스 안에 있는 메서드(기능) 문자열.equals(비교 문자열) 문자열은 대소문자 구분한다.

개발 기록/JAVA

[JAVA] 상수 | 변수의 상수화 | final | CONSTANT

상수 : 항상 유지되는 수 (변하지 않는 수) 변수의 상수화 : 변수에 저장된 값을 변경하지 않고 상수처럼 사용함 변수를 상수화시키면 초기화 이후 값을 바꿀 수 없다. 상수화 방법 final 자료형 변수명 = 값; 상수의 변수명은 모든 글자를 대문자로 쓰는 게 좋다. 개발자들 간의 예의이자 약속 public class Prca { public static void main(String[] args) { int a = 3; a = 4; // 변수이니 가능 final double PI = 3.14; PI = 3.15; // 상수이니 불가능 } }

개발 기록/JAVA

[JAVA] 자바의 형변환

형변환 : 변수나 상수의 데이터 타입을 다른 타입으로 변환하는 것 형변환의 종류 - 자동 형변환 (묵시적 형변환) : 자동으로 타입이 변환되는 것 - 강제 형변환 (명시적 형변환) : 코드 상 강제로 형식을 변환시키는 것 강제형변환 방법 (자료형)변수명; 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); // 참고 // 컴퓨터는 문자를 저장할 수 없다 // 따라서 문자마다 고유한 숫자값을 부여했는데 // 그 숫자가 바로 문자의 아스키..

개발 기록/JAVA

[JAVA] 자바의 자료형 | DATA TYPE | BIT와 BYTE

자료형 : 자료(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..

우준성
'개발 기록/JAVA' 카테고리의 글 목록