그 외 ... (정리해야함)

class A class B extends A B는 A의 하위 타입이다. 하지만 List는 List의 하위타입이 아니다. 제네릭 타입을 사용할 때 가끔 클래스의 하위 타입을 받아들여야 하는 경우가 있다. 아래의 소스를 보자 public static Stack pushAll(final List list){ final Stack stack = new Stack(); for(A a : list){ stack.push(a); } return stack; } public void test(){ final ArrayList listA = new ArrayList(); final ArrayList listB = new ArrayList(); for(int i=0; i
2019/04/23 - [프로그래밍 노트/JAVA] - [JAVA] String 객체와 리터럴 (메모리관련) => 이 글을 읽으면 이해가 더 쉽게 된다. String 리터럴은 실행할 때 JVM이 특별히 관리를 하게 된다. JVM은 String 리터럴과 불변성에 어떤 도움을 줄까? 클래스가 로드되면 모든 리터럴이 상수 풀(constant pool)에 위치하게 된다. 그리고 String 리터럴은 풀 안의 같은 상수를 참조해서 이루어지는데 이를 String 인터닝(Interning)이라고 한다. 인터닝은 이 풀 안에 있는 상수들이 JVM에서 실행되는 모든 클래스를 참조할 수 있게 한다. String 인턴 풀은 컴파일할 때 단지 String 리터럴을 가져오는 것이 아니라, intern 메서드를 이용해서 Stri..
String 클래스에서 String 객체의 값을 변경하는 것처럼 보이는 모든 메서드는 실제로는 String 값을 변경하는 것이 아니라, 새로운 String 인스턴스를 반환하는 것이다. String의 값은 절대 변하지 않으며 바꿀 수 없다. @Test public void stringChanges(){ final String greeting = "Good Morning, Corn"; final String substring = greeting.substring(0, 4); assertTrue(substring.equals("Good")); assertFalse(greeting.equals(substring)); assertTrue(greeting.equals("Good Morning, Corn")); } ..
String 객체를 표현하는 값은 char의 배열이다. public final class String implements java.io.Serializable, Comparable, CharSequence { @Stable private final byte[] value; .... } JVM과 컴파일러는 특정 상황에서 특별한 방법으로 String 객체를 처리한다. 참고) 2019/04/23 - [프로그래밍 노트/JAVA] - [JAVA] String 객체와 리터럴 (메모리관련) [JAVA] String 객체와 리터럴 (메모리관련) 항상 읽어도 이해하기 힘들 부분이었으나, 이번 기회에 확실히 이해하고 정리를 하게 되었다. Java에서 String을 생성하는 방식은 두가지가 있다. new 연산자를 이용하는 ..
객체 지향 개발의 두가지 핵심 개념은 아래와 같다. 다형성(Polymorphism) 상속(Inheritance) 다형성(Polymorphism) 같은 자료형에 여러 가지 객체를 대입하여 다양한 결과를 얻어내는 성질 (동일한 조작방법으로 동작시키지만 동작방법은 다른 것을 의미한다.) 상속(Inheritance) 부모 클래스에서 클래스의 행동과 정의를 가져다 사용할 수 있게 해준다. 기존의 정의와 상태를 상속받아 사용할 수 있으며, 새로운 행동을 추가하거나 새로운 타입에 대한 행동을 오버라이드 할 수 있다. 정사각형(Square)는 사각형(Rectangle)이다. (is -a rectangle) 상속을 이용해 정사각형 만들기 public class Rectangle { private final int wid..
정적(static)메서드와 변수는 클래스 내부에 정의하지만 인스턴스에는 속하지 않는다. 대개 클래스 이름을 통해 정적 메서드와 정적 변수에 접근한다. ※ 정적 메서드와 변수에 접근할 때는 클래스 이름을 이용하는 것을 추천 => 인스턴스를 이용해서 접근하면 혼란을 야기할 수 있기 때문이다. 인스턴스나 클래스 자신을 참조해서 클래스 멤버 변수를 관리할 수 있음을 보여주는 예 public class ExampleClass { public static int EXAMPLE_VALUE = 6; } @Test public void staticVariableAccess(){ assertEquals(ExampleClass.EXAMPLE_VALUE, 6); ExampleClass c1 = new ExampleClass(..
객체에 선언하는 final 키워드는 원시 타입에 선언한 final 키워드와 동일한 역할을 한다. 즉, 일단 할당이 되고 나면 메모리 위치가 변경되지 않는다. 단, 객체 참조는 변경할 수 없어도 객체 내부의 값들의 개별 값들이 final이 아니라면 변경할 수 있다. @Test public void finalReferenceChanges(){ final int i = 45; // i = 46; 컴파일 에러가 남 final List list = new ArrayList(); assertEquals(0, list.size()); list.add("add"); assertEquals(1, list.size()); list.clear(); assertEquals(0, list.size()); }
객체 => 상태와 행위가 존재함 (개체(entity)와 개체들에 관련된 연산을 제공하는 메서드들의 모음을 나타냄) 원시 타입(primitive type)을 제외하면 자바 언어의 다른 모든 변수들은 참조 타입이다. 객체는 참조 타입이다. 라는 말은 정확히 무엇을 의미하는 것일까? 원시 타입은 int i = 42로 변수가 선언되었을 때, 42라는 값이 메모리에 할당된다. 그러면 프로그램은 나중에 int j = i 라는 형식으로 i에 의해 표현되는 값이 j에 할당되었을 때 메모리의 다른 위치에 같은 값을 할당한다.(일단 할당하고 나면 i는 j의 값에 영향을 미칠 수 없다.) 그렇다면 객체 타입은 어떻게 동작할까 자바에서 new ArrayList(20)같은 구문은 데이터를 저장하는데 필요한 영역을 메모리에 요구..
Queue는 선입선출(First In First Out)자료구조를 구현한 자바 인터페이스이다. 새 원소를 추가하는 add, 오래된 원소를 제거하는 remove, 가장 오래된 원소를 반환하지만 삭제하지 않는 peek 메서드가 있다. Deque(`덱(deck)`이라고 발음함)는 Queue 인터페이스의 확장이며 자료구조의 양끝에 원소를 추가하고 삭제할 수 있다. @Test public void queueInsertion(){ final Queue queue = new LinkedList(); queue.add("first"); queue.add("second"); queue.add("third"); Assert.assertEquals("first", queue.remove()); Assert.assertEqu..
리스트 정렬된 컬렉션 List 인터페이스를 사용 배열과 리스트의 관계 배열 JVM은 배열이 생성될 때 반드시 배열의 크기를 알아야 한다. final String[] stringArray = new String[3]; 배열의 원소에는 인덱스 값을 이용해서 직접 접근할 수 있다.(랜덤 접근 Random Access) 배열 전체를 사용 중일 때 원소를 추가하려면 배열 크기를 늘려야 한다. 배열 복사 후 새로운 배열이 원본 배열의 주소를 가리키도록 재할당 @Test public void arrayCopy(){ int[] integers = {0, 1, 2, 3, 4}; int[] newIntegersArray = new int[integers.length + 1]; System.arraycopy(integers..
깡냉쓰
'그 외 ... (정리해야함)' 카테고리의 글 목록 (4 Page)