20201024_TIL
by Haebin Seo
오늘 한 일
- Java 공부
- 배열
- fixed length
- 선언
// 둘 다 가능 int[] arr = new int[10]; int arr[] = new int[10];
- 초기화
초기화 없이 선언만 한 경우 정수는 0, 실수는 0.0, 객체 배열은 null로 초기화 된다.int[] arr = new int[] { 0, 1, 2 }; // 선언과 초기화를 동시에 할 때는 배열의 개수 명시 x. int[] arr = { 0, 1, 2 }; // 가능은 하지만 Java에서 많이 사용하는 형태는 x.
- 객체 배열
객체 배열은 선언 후 각 인덱스마다 인스턴스를 생성해 참조값을 할당해주어야 한다.public class BookArray { public static void main(String[] args) { Book[] library = new Book[5]; library[0] = new Book("태백산맥", "조정래"); library[1] = new Book("데미안", "헤르만 헤세"); library[2] = new Book("어떻게 살 것인가", "유시민"); library[3] = new Book("토지", "박경리"); library[4] = new Book("어린왕자", "생텍쥐페리"); : : } }
- method
- 배열 복사
System.arraycopy(src, srcPos, dest, destPos, length) // 얕은 복사, 참조 값 변경
매개변수 설명 src 복사할 배열 이름 srcPos 복사할 배열의 첫 번째 위치 dest 복사해서 붙여넣은 대상 배열 이름 destPos 복사해서 대상 배열에 붙여넣기를 시작할 첫 번째 위치 length src에서 dest로 자료를 복사할 요소 개수
- 배열 복사
- 다차원 배열
int[][] arr = new int[2][3]; int[][] arr = { { 1, 2, 3 }, { 4, 5, 6 } }; System.out.println(arr.length); // 2 System.out.println(arr[0].length); // 3
- ArrayList class
기존 배열은 길이를 정해 선언하므로, 필요한 경우 복사, 삽입, 삭제 관련 코드를 직접 구현해야 한다. ArrayList는 객체 배열을 class로 구현한 것으로 여러 메서드와 속성들을 사용하여 객체 배열을 편하게 관리할 수 있다.ArrayList<String> list = new ArrayList<String>(); list.add("aaa"); String s = list.get(0); // aaa
-
주요 메서드
메서드 설명 boolean add(E element) 요소 하나를 배열에 추가한다. E는 요소의 자료형을 의미한다. int size() 배열에 추가된 요소 전체 개수를 반환한다. E get(int index) 배열의 index 위치에 있는 요소 값을 반환한다. E remove(int index) 배열의 index 위치에 있는 요소 값을 제거하고 그 값을 반환한다. boolean isEmpty() 배열이 비어 있는지 확인한다.
-
- 향상된 for 문 (enhanced for loop)
String[] strArr = { "Java", "Android", "C" }; for(String s : strArr) { : : }
- 상속
클래스를 정의할 때 이미 구현된 클래스를 상속(inheritance) 받아서 속성이나 기능이 확장되는 클래스를 구현함- 상속하는 클래스: 상위 클래스, parent class, base class, super class
상속 받는 클래스: 하위 클래스, child class, derived class, subclass - 클래스 상속 문법
extends 뒤에는 단 하나의 class만 사용할 수 있다. Java는 single inheritance만을 지원한다.class B extents A { }
- 상속은 재사용이다. 하지만 재사용이 상속은 아니다.
재사용이 필요하다고 다 상속을 하는 것이 아니라 보편적인 기존의 클래스에서 더 구체적인 클래스를 만들 때 사용하는 것이다. 그 외의 경우에는 변수로 선언해서 사용해야 한다. (aggregation, 합성)- java에서의 재사용 방법
상속(inheritance) : is-a 관계 합성(aggregation) : has-a 관계
- java에서의 재사용 방법
-
접근 제한자 가시성
접근 제어자 외부 클래스 하위 클래스 동일 패키지 내부 클래스 public O O O O protected X O O O 선언되지 않음
(default)X X O O private X X X O -
상속에서의 메모리 상태
상위 클래스의 생성자가 먼저 호출되고, 그 다음에 하위 클래스의 생성자가 호출된다. 만약 상위 클래스에 private 변수가 있다면 생성은 되지만, 하위 클래스에서 볼 수는 없다. - super 예약어
this가 자기 자신의 인스턴스의 주소를 가지는 것처럼 super는 하위 클래스가 상위 클래스에 대한 주소를 가진다. 하위 클래스가 상위 클래스에 접근할 때 사용할 수 있다.
- 상속하는 클래스: 상위 클래스, parent class, base class, super class
- 업캐스팅 (up-casting, 상위 클래스로의 묵시적 형 변환)
상위 클래스 형으로 변수를 선언하고 하위 클래스 인스턴스를 생성할 수 있다. 하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로 묵시적 형변환이 가능하다.Customer vc = new VIPCustomer();
이 경우 VIPCustomer() 생성자의 호출로 멤버 변수는 모두 생성되었지만 타입이 Customer이므로 접근할 수 있는 변수나 메서드는 Customer의 변수와 메서드 뿐이다.
- 가상 메서드 (virtual method)
// up-casting과 재정의(overriding) 된 메서드 호출 // Customer와 VIPCustomer class 중 누구의 메서드가 호출될까? Customer customer = new Customer(); Customer vip = new VIPCustomer(); customer.calcPrice(10000); // Customer vip.calcPrice(10000); // VIPCustomer
Java는 기본적으로 모든 메서드가 가상 메서드이다. (c++는 가상 메서드 사용을 위해 virtual 키워드를 사용) 위의 예제에서 customer와 vip는 같은 calcPrice() 메서드를 호출한 것처럼 보이지만 실제 실행된 코드는 다르다. 이것을 가상함수 호출이라 하며, 메서드 호출에 대해 실행 시점에서 호출된 객체의 타입을 보고 어떤 메서드가 호출될 것인지 결정하는(동적 바인딩) 것을 가상함수라고 한다.
메서드는 멤버 변수와는 다르게 code 영역에 저장된다. 가상 메서드 테이블(vtable)은 각 클래스 별로 자신으로부터 Object까지 모든 조상들의 메서드들의 주소를 가지고 있는 포인터 배열이다. 이들은 해당 클래스를 포함해 가장 마지막으로 오버라이딩된 코드를 가리킨다. 메서드가 호출되면 각 객체 heap 영역의 제일 앞에 있는 포인터를 따라 가상 메서드 테이블을 참조하고, 거기서 해당 메소드를 가리키는 포인터를 따라 코드를 실행하게 된다.
프로그램에서 어떤 객체의 멤버 변수나 메서드의 참조는 그 타입에 따라 이루어진다. 하지만 오버라이딩 된 메서드는 타입과 상관없이 실제 생성된 인스턴스의 메서드가 호출된다.
이러한 특징이 다형성(polymorphism)을 구현할 수 있는 기반이 된다.
- 다형성(polymorphism)
하나의 코드가 여러가지 자료형으로 구현되어 실행되는 것을 뜻한다. 위의 가상 메서드 예제에서 Customer 변수의 calcPrice() 메서드가 인스턴스에 따라 다른 동작을 하는 것을 예로 들 수 있다.정보은닉
,상속
과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나이다. 객체지향 프로그래밍의 유연성, 재활용성, 유지보수성에 기본이 되는 특징이다.- 구현
하나의 클래스를 상속 받은 여러 클래스가 있는 경우, 각 클래스마다 같은 이름의 서로 다른 메서드를 재정의 한다. 이 때 상위 클래스 타입으로 선언된 하나의 변수가 여러 인스턴스에 대입되어 다양한 구현을 가질 수 있다.
- 구현
- 배열
참조
Do it! 자바 프로그래밍 입문: https://www.inflearn.com/course/자바-프로그래밍-입문/dashboard
Subscribe via RSS