Language/Java

Language/Java

제네릭과 컬렉션 프레임워크

제네릭 다음의 ObjectBox 클래스는 어떤 오브젝든지 저장할 수 있고, 어떤 오브젝든지 꺼낼 수 있다. 하지만 꺼내서 사용할 때는 원래 타입으로 변환시키는 번거로운 과정이 필요하다. ObjectBox box = new ObjectBox(); box.setObject("kim"); String str = (String) box.getObject(); System.out.println("str.toUpperCase() = " + str.toUpperCase()); box.setObject(5); Integer i = (Integer) box.getObject(); System.out.println(i.intValue()); 이러한 과정을 해소시키위해 제네릭이라는 문법이 등장했다. 그리고 여기서 T는 아직..

Language/Java

배열

이차원 가변 배열의 선언과 초기화 타입[][] 변수명 = new 타입[행의수][]; 변수명[행의인덱스] = new 타입[열의수]; Arrays 배열을 다룰때 사용하는 유틸리티로 java.util이라는 패키지에 포함되어 있다. 여기서 java.lang 패키지에 있는 클래스를 제외한 패키지 내의 클래스를 사용하려면 해당 패키지 경로를 import 해줘야 한다. package theory.array; import java.util.Arrays; public class ArrayMain { public static void main(String[] args) { int[] copyFrom = {1, 2, 3}; int[] copyTo1 = Arrays.copyOf(copyFrom, 5); int[] copyTo..

Language/Java

익명 클래스 (Anonymous Class)

추상 클래스나 인터페이스의 추상 메서드를 구현하기 위해 생성자 뒤에 중괄호가 나오고, 코드를 오버라이딩하여 구현한다. Car car = new Car() { @Override public void a() { System.out.println("이름없는 객체의 a 메서드 오버라이딩"); } }; car.a(); public class MyRunnableExecute { public void execute(MyRunnable myRunnable) { myRunnable.run(); } } MyRunnable m = new MyRunnable() { @Override public void run() { System.out.println("달릴 수 있다."); } }; MyRunnableExecute e = n..

Language/Java

팩토리 메서드 패턴과 Java Reflection

싱글톤 패턴 private 생성자를 만든다. 즉, 외부에서 인스턴스를 생성하지 못하게 한다. 자기 자신 인스턴스를 참조하는 static한 필드를 선언한다. 2번에서 생성한 인스턴스를 반환하는 static한 메서드를 만든다. public class BeanFactory { // 2. 자기 자신 인스턴스를 참조하는 static한 필드를 선언한다. private static BeanFactory instance = new BeanFactory(); // 1. private 생성자를 만든다. 즉, 외부에서 인스턴스를 생성하지 못한다. private BeanFactory() { } // 3. 2번에서 생성한 인스턴스를 반환하는 static한 메서드를 만든다. public static BeanFactory getI..

Language/Java

인터페이스

요구사항을 받았을 때, 우리는 아키텍처를 기반으로 어떤 기능을 만들어야 할지부터 고민한다. 즉, 만들어야 할 기능들이 선언만 되어있고, 관련된 것들끼리 묶은 후 이름을 지어주는데, 이를 인터페이스라고 한다. 인터페이스 작성 문법 인터페이스의 모든 필드는 public static final이어야 하며, 모든 메서드는 public abstract이어야 한다. 단, public, final, abstract 는 생략하면 자동으로 붙는다. Java 8부터는 default 메서드와 static 메서드도 선언이 가능하다. /** * 1. 1 ~ 45 까지 써져있는 Ball을 로또 기계에 넣는다. * 2. 로또 기계에 있는 Ball들을 섞는다. * 3. 섞인 Ball 중에서 6개를 꺼낸다. */ public inte..

Language/Java

부모가 될 수 없는 클래스 - String

상속을 금지 시킨 클래스를 정의할 때는 final 키워드를 사용하고, 그 대표적인 예로 String 클래스가 있다. public final class String{..} 그리고 String 클래스는 불변 객체이다. 다음과 같이 코드가 있다. package theory.util; public class StringExam { public static void main(String[] args) { String str1 = "hello"; String str2 = "hello"; String str3 = new String("hello"); String str4 = new String("hello"); if (str1 == str2) { System.out.println("str1 == str2"); } i..

Language/Java

추상클래스

추상 클래스는 그 자체로 인스턴스가 될 수 없으며, 상속받는 자손이 인스턴스가 된다. 그리고 abstract 키워드를 사용하여 클래스를 정의한다. 추상 클래스는 보통 1개 이상의 추상 메서드를 가지지만, 없다해도 오류가 발생하진 않는다. 추상 메서드 다음의 Car2 클래스를 만든 사람이 run()이라는 메서드가 필요하다라고 생각을 하고, run()은 자동차마다 다르게 구현할 것 같다고 생각이 들면 추상메서드를 만들게 된다. public abstract class Car2 { public Car2(String name) { System.out.println("Car2() 생성자 호출"); } // 추상메서드 public abstract void run(); } 그리고 부모가 가지는 추상메서드는 자식 클래스..

Language/Java

super() 생성자와 불변 객체

super는 인스턴스 부모를 참조할 때, 사용하는 키워드이다. 부모의 생성자를 호출할 때는 super()를 사용한다. super() 생성자는 부모 생성자를 의미하며, 생성자 안에서만 사용이 가능하다. 그리고 생성자 안에 첫번째 줄에만 올 수 있다. 생성자는 무조건 super()를 호출해야 한다. 사용자가 super() 생성자를 호출하는 코드를 작성하지 않았다면 자동으로 부모의 기본 생성자가 호출된다. 따라서 부모클래스가 기본 생성자를 가지고있지 않다면, 사용자는 반드시 직접 super() 생성자를 호출하는 코드를 작성해야 한다. 불변 객체 인스턴스가 생성될 때 필드에 값을 넣어주고, 객체 내 어떤 메서드도 필드의 값을 변경시킬 수 없는 객체

Language/Java

상속

상속 관계는 is a(~는 ~이다.) 관계 또는 kind of(~는 ~의 종류이다.) 관계가 되어야 한다. 자식은 부모의 종류 중 하나이다. 그리고 여러 종류의 객체를 하나의 이름으로 부를 수 있는 것을 일반화라고 한다. 예를들어, 버스, 레미콘, 트럭을 자동차라고 부른다면 그것은 일반화시킨 것이다. 상속은 일반화와 확장의 개념을 합한 것이라고 생각하면 된다. 즉, 예를들어, 자동차에 삽을 달아놓는다고 하면 그것은 자동차를 확장시켜서 포크레인을 만든 것이다. 따라서 부모클래스를 상속받는다는 것은 부모가 가지고있는 것을 자식이 물려받아 사용할 수 있다는 것을 의미한다. 아무것도 상속받지 않으면 자동으로 java.lang.Object를 상속받는다. 그렇기 때문에 모든 클래스의 최상위 클래스는 Object가 ..

Language/Java

Package

패키지 이름은 보통 도메인 이름을 거꾸로 적은 후에 프로젝트 이름 등을 붙여서 만들게 된다. 그리고 패키지 구조는 소프트웨어 아키텍처에 따라 달라진다. 즉, 구체적인 아키텍처를 가지고 있는 프로그램을 만들때, 패키지에 대해 이해할 수 있게 되는 것이다. 패키지 연습하기 com.example.util이란 패키지에 Calculator 클래스를 작성한다고 하자. 그러면 com.example은 도메인 이름을 거꾸로 적은 것이고, util은 프로젝트나 모듈의 이름이 된다. 그렇다면 패키지 이름을 작성할 때 왜 도메인 이름을 거꾸로 적는것일까? 우리는 오픈 소스를 사용하는데, 다른 사람이 만든 클래스 중에 내가 만든 클래스와 이름이 같은 경우가 있다. 하지만 같은 폴더에는 같은 이름의 파일이 여러 개가 있을 수 없..

kimjingyu
'Language/Java' 카테고리의 글 목록 (2 Page)