일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- string
- 큐
- Properties
- 스프링부트
- javascript
- scanner
- spring boot
- map
- date
- 리소스모니터링
- alter
- NIO
- GC로그수집
- union_find
- set
- CSS
- 스택
- html
- JPA
- 힙덤프
- Calendar
- Union-find
- sql
- dfs
- priority_queue
- math
- deque
- List
- Java
- BFS
- Today
- Total
매일 조금씩
11/11 - Java (3) : 생성자, final, 객체 참조 배열, 상속, 오버라이딩 본문
11/11 - Java (3) : 생성자, final, 객체 참조 배열, 상속, 오버라이딩
mezo 2020. 11. 11. 17:17복습 & 개념정리
1. 배열
일차원
다차원
- 데이터(엑셀)
- 2차원 (유사)배열
2. 데이터타입
* 메모리
1) 기본형
int
2) 참조형
개발자 선언
사물 인스턴스
사물 (공통) 객체(속성, 기능) (코딩) class(필드, 메서드) (데이터) 인스턴스
사물 인스턴스
- 공통 - 추상화
객체 모델링 - UML(Unified Modeling Language) - UML다이어그램 staruml.io/
- 데이터 - 인스턴스화
3. 객체
- 캡슐화
- 상속성
추상화
다형성
4. class
(멤버)필드
인스턴스 필드
클래스(static) 필드
메서드
인스턴스 메서드
클래스(static) 메서드
* 지역변수, 제어문
* overloading
5. 인스턴스
클래스명 객체변수;
객체변수 = new 클래스명(); // new 는 메모리 생성 연산자
객체변수.필드
객체변수.메서드
클래스
※ 클래스 작성법
- 파일 1개 - 클래스 1개가 원칙
- 파일 내에 class가 한개일 때는 public 생략 가능
- java를 실행시키면 실행 클래스를 찾아간다.
- 실행 클래스는 public static void main(String [] args) 이다
- 실행마다 다른 옵션을 주고 싶을 때 아래처럼 실행할 때 옵션 값을 줘서 args값을 넣는다.
- 여러개의 파일에 클래스를 하나씩 만들고 main파일에서 참조할 수 있다. (클래스 모듈화)
1. 생성자 함수 ( Constructor)
▷p203
new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.
- 클래스명과 같다.
- return타입이 없다. (이미정해진 return타입이 있음)
- 모든 클래스는 생성자가 반드시 존재하며, 하나 이상을 가질 수 있다.
- 생성자를 생략하면 기본 생성자가 생성된다.
- 때문에 생성자를 선언하지 않아도 다음과 같이 new 연산자 뒤에 기본 생성자를 호출해서 객체를 생성시킬 수 있다.
- 기존에 new를 써서 Student s = new Student(); 로 객체를 생성한게 사실은 생성자 함수를 사용한 것이였다.
- 클래스가 public class 로 선언되면 기본 생성자에서도 public이 붙지만, 클래스가 public이 없이 class로만 선언되면 기본생성자에도 public이 붙지 않는다.
- s.Student(); 처럼 직접 호출 불가능
- 반드시 new를 써서 객체를 생성할 때 호출 가능
- 기본생성자는 다른 생성자함수가 없을 땐 자동 생성되지만, 다른 생성자함수가 있다면 써줘야한다.
1-1. 생성자 함수 오버로딩
▷p208
Car car1 = new Car();
Car car2 = new Car("그랜저");
이와같이 어떤 형태로 어떤 인자를 주면서 객체를 생성하느냐에 따라 다른 생성자가 호출되며,
클래스 내에 정의된 고정된 멤버변수 값이 아닌 값이 다른 멤버 변수를 가지는 객체를 생성할 수 있다.
1-2. 다른 생성자 호출 (this())
▷p212
생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드 발생을 줄이기 위함이다. 필드 초기화 내용은 한 생성자에만 집중적으로 작성하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선시킨 것이다.
Car("000","소나타"); 처럼 직접호출이 불가능하므로 this()를 사용한다.
- this는 참조주소이고, this()는 생성자이다.
- this()는 호출될 때 첫줄에 와야한다. 중간에 올수 없다.
- 파라미터가 많은 생성자가 초기화를 집중적으로 담당한다. 다른 생성자들은 이 생성자를 호출해서 초기화 한다.
2. 블럭 (Block)
▷p239
- 멤버필드의 초기화를 하기 위함이다.
- main함수 내에 있는 것을 외부 클래스에서 하는 것과 같다.
- 클래스 내부에서 실행문을 쓸수 없기 때문에 간접적으로 실행문을 쓰려고 사용한다. 생성자를 사용하는 것이 낫다.
- 인스턴스 필드는 생성자에서 초기화 되지만, 정적필드(static)는 객체 마다 다 같은 값이므로 객체 생성 없이도 사용해야 하기 때문에 생성자에서 초기화 수 없다.
- 정적 블록은 클래스가 메모리로 로딩될 때 자동적으로 실행된다. (클래스파일 만들때 실행됨)
- static 변수를 필드에 선언해 놓고 초기화는 다른 곳에 하게 되면 초기화는 객체가 생성될 때 된다.
- 따라서, static 변수의 선언과 초기화를 따로 할때, 초기화를 static 블록 안에 넣어줘야한다.
3. final 필드와 상수
3-1. final 필드
▷p245
3-2. 상수 (static final)
▷p246
변수명을 대문자로 써주는 것이 좋다.
4. 객체를 참조하는 배열
▷p165
- 기본타입(byte, char, float, int, long, float, double, boolean) 배열은 각 항목에 직접 값을 갖고 있지만, 참조 타입(클래스, 인터페이스) 배열은 각 항목에 객체의 번지를 가지고 있다.
- 예를 들어 String은 클래스 타입이므로 String[] 배열은 각 항목에 문자열이 아니라, String객체의 주소를 가지고 있다. 즉, String 객체를 참조하게 된다.
- 객체를 참조하는 배열은 2차원 배열 형태를 가지고 있다.
→ for문을 인덱스를 객체로 놓고 향상된 for문으로도 작성이 가능하다.
5. java.lang.String 클래스
C언어에서는 문자열을 char형 배열로 표현하지만, 자바에서는 문자열을 위한 String이라는 클래스를 별도로 제공한다.
String 클래스에는 문자열과 관련된 작업을 할 때 유용하게 사용할 수 있는 다양한 메소드가 포함되어있다.
이러한 String 클래스는 java.lang 패키지에 포함되어 제공된다.
String 인스턴스는 한 번 생성되면 그 값을 읽기만 할 수 있고, 변경할 수는 없다.
이러한 객체를 자바에서는 불변 객체(immutable object)라고 한다.
즉, 자바에서 덧셈(+) 연산자를 이용하여 문자열 결합을 수행하면, 기존 문자열의 내용이 변경되는 것이 아니라 내용이 합쳐진 새로운 String 인스턴스가 생성되는 것이다.
docs.oracle.com/javase/8/docs/api/index.html
대표적인 String 메소드
String 클래스의 메소드는 매우 다양하며, 그중에서 많이 사용되는 메소드는 다음과 같다.
char charAt(int index) |
해당 문자열의 특정 인덱스에 해당하는 문자를 반환함. |
int compareTo(String str) |
해당 문자열을 인수로 전달된 문자열과 사전 편찬 순으로 비교함. |
int compareToIgnoreCase(String str) | 해당 문자열을 인수로 전달된 문자열과 대소문자를 구분하지 않고 사전 편찬 순으로 비교함. |
String concat(String str) |
해당 문자열의 뒤에 인수로 전달된 문자열을 추가한 새로운 문자열을 반환함. |
int indexOf(int ch) int indexOf(String str) |
해당 문자열에서 특정 문자나 문자열이 처음으로 등장하는 위치의 인덱스를 반환함. |
int indexOf(int ch, int fromIndex) int indexOf(String str, int fromIndex) |
해당 문자열에서 특정 문자나 문자열이 전달된 인덱스 이후에 처음으로 등장하는 위치의 인덱스를 반환함. |
int lastIndexOf(int ch) | 해당 문자열에서 특정 문자가 마지막으로 등장하는 위치의 인덱스를 반환함. |
int lastIndexOf(int ch, int fromIndex) | 해당 문자열에서 특정 문자가 전달된 인덱스 이후에 마지막으로 등장하는 위치의 인덱스를 반환함. |
String[] split(String regex) | 해당 문자열을 전달된 정규 표현식(regular expression)에 따라 나눠서 반환함. |
String substring(int beginIndex) | 해당 문자열의 전달된 인덱스부터 끝까지를 새로운 문자열로 반환함. |
String substring(int begin, int end) | 해당 문자열의 전달된 시작 인덱스부터 마지막 인덱스까지를 새로운 문자열로 반환함. |
String toLowerCase() | 해당 문자열의 모든 문자를 소문자로 변환함. |
String toUpperCase() | 해당 문자열의 모든 문자를 대문자로 변환함. |
String trim() | 해당 문자열의 맨 앞과 맨 뒤에 포함된 모든 공백 문자를 제거함. |
length() | 해당 문자열의 길이를 반환함. |
isEmpty() | 해당 문자열의 길이가 0이면 true를 반환하고, 아니면 false를 반환함. |
6. 상속
▷p288
6-1. 두개의 클래스를 사용하는 방법 2가지
1) 클래스를 객체 변수 (인스턴스)로 사용하기 - has ~ a 부속/연관 관계
class A{
}
class B{
A a;
}
사원에 대한 객체
사원{
사원정보
- 이사만의 정보
- 정직원만의 정보
- 계약직만의 정보
}
이사, 정직원, 계약직
2) 클래스를 상속 - is ~ a 대등 관계
- 이미잘 개발된 클래스를 재사용해서 새로운 클래스를 만들기 때문에 코드의 중복을 줄여준다.
- 상속을 해도 부모 클래스의 모든 필드와 메소드들을 물려받는 것은 아니다.
- 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다.
- 클래스명 뒤에 extends 뒤에 기술한다.
- 다른언어와는 달리 자바는 다중 상속을 허용하지 않는다.
6-2. Object 클래스
▷p457
- 모든것의 최고 조상은 Object 클래스이다.
- 상속받지 않으면 최소한 Object는 상속받는다.
- 필드가 필요없고, 메소드들로 구성되어있다.
- 메소드들은 모든 클래스가 Object를 상속하기 때문에 모든 클래스에서 사용이 가능하다.
6-3. 부모 생성자 호출
▷p292
- 반드시 부모생성자 다음에 자식생성자가 호출된다.
- 자식과 부모의 주소가 같다는 것을 알수 있다.
- 이는 따로 만들어지는 것이 아니라 상속이 이루어지면 같은곳에 생성되는 것을 의미한다.
- super(매개값, ...)는 자식 생성자에서 매개값의 타입과 일치하는 부모 생성자를 호출한다.
- super(매개값, ...)는 this()와 역시 첫줄에 와야한다.
- super(매개값, ...)이 생략되면 컴파일러에 의해 super()가 자동적으로 추가되기 때문에 부모의 기본생성자가 존재해야 한다.
- 자식생성자와 부모생성자가 모두 기본 생성자가 아닐 때, 부모생성자를 쓰려면 무조건 super(매개값, ...)를 써줘야 한다.
6-4. 메소드 재정의 (오버라이딩)
▷p295
- 오버로딩은 한 클래스 내에서 쓰는 것이고, 오버라이딩은 부모- 자식에 쓰는 것이다.
- 부모에 있는 함수를 자식에서 같은 이름으로 다시 정의하게 되면 자식 것을 실행시킨다.
- 부모의 메소드와 동일한 시그니처(리턴 타입, 메소드 이름, 매개 변수 리스트)를 가져야한다.
- 접근 제한을 더 강하게 오버라이딩 할 수 있다.
- 새로운 예외를 throw할 수 없다.
- 자식 안에서 부모를 부를땐 super.부모메소드(); 를 사용하고, 내가 나를 부를땐 this.메소드();
▷p298
(관련 예제)
6-5. final 클래스와 final 메소드
- 쉽게 말해서 마지막으로 처리한다는 뜻이다. 상수화 시키는 것.
- 클래스를 선언할 때 final 키워드를 class 앞에 붙이게 되면 이 클래스는 최종적인 클래스이므로 상속할 수 없는 클래스가 된다.
- 따라서 클래스와 메소드 선언 시에 final 키워드가 지정되면 상속과 관련이 있다.
- 메소드를 선언할 때 final 키워드를 붙이게 되면 이 메소드는 최종적인 메소드이므로 오버라이딩 할 수 없는 메소드가 된다.
- 즉, 부모 클래스를 상속해서 자식 클래스를 선언할 때 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의 할 수 없다는 것이다.
'빅데이터 플랫폼 구축을 위한 자바 개발자 양성과정' 카테고리의 다른 글
11/13 - 미니프로젝트 : html, css로 자기소개 페이지 만들기 (3) | 2020.11.16 |
---|---|
11/12 - Java(4) : package, import, 접근 제한 (0) | 2020.11.12 |
11/10 - Java (2) : 배열, 객체지향, 클래스, 메소드, this, static (0) | 2020.11.10 |
11/09 - Java (1) : 자료형, 연산자, 제어문 (0) | 2020.11.10 |
11/06 - Javascript (6) : bom, <form>, dom (0) | 2020.11.10 |