생성자
생성자
- 객체를 생성할 때 호출하는 메서드 비슷한 것
- new 키워드와 함께 호출
- 일반 멤버 변수의 초기화나 객체 생성 시 실행돼야 하는 작업 정리
- 메서드와 비슷하나 리턴 타입이 없고 이름은 클래스 이름과 동일
기본 생성자, default constructor
- 그 동안 예제에서는 생성자를 작성하지 않았음.
- 기본 생성자의 형태는 파라미터가 없고 구현부가 비어있는 형태
- 생성자 코드가 없으면 컴파일러가 기본 생성자 제공
- public Default(){}
파라미터가 있는 생성자
- 생성자의 목적이 일반 멤버 변수의 초기화 => 생성자 호출시 값을 넘겨서 초기화
- 주의! 파라미터가 있는 생성자를 만들면 기본 생성자는 추가되지 않는다.
갈색 => 로컬 변수
파란색 => 멤버 변수
this
- 참조 변수로써 객체 자신을 가리킴
- 참조변수로 객체의 멤버에 접근했던 것처럼 this로 자신의 멤버에 접근
- 용도 : 로컬 변수와 멤버 변수의 이름이 동일할 경우 멤버 변수임을 명시적으로 나타냄
- 명시적으로 멤버임을 나타낼 경우 사용
- this는 객체에 대한 참조
- 따라서 static영역에서 this 사용 불가
- 메서드와 마찬가지로 생성자도 오버로딩 가능
- 객체 생성 시 필요한 멤버변수만 초기화 진행 => 생성자 별 코드의 중복 발생
- 반드시 첫 줄에서만 호출이 가능
italic 글씨체 => static ex) System.out.println();
초기화 블록, initializer
- 생성자처럼 멤버 변수의 초기화가 목적
- 생성자와 겹칩.. 잘 안 사용됨.
- 클래스 초기화 블록
- 인스턴스 초기화 블록
Java 기본 문법, 응용#3
상속, Inheritance
- 상위 클래스의 자산을 자식 클래스에서 재사용하기 위한 것
- 생성자와 초기화 블록은 상속 x
- 상위 클래스의 멤버를 물려 받기에 코드의 절감
- 상위 클래스 코드 변경 시 모든 하위 클래스 적용
- extends 키워드 사용.
public class Person{
String name;
void eat(){};
void jump(){};
}
public class SpiderMan extends Person{
boolean isSpider;
void fireWeb(){}
}
-> 스파이더맨의 멤버는 5개. 메서드도 멤버임.
Object 클래스
- 모든 클래스의 조상 클래스
- 별도의 extends 선언이 없으면 extends Object가 생략됨
- 따라서 모든 클래스에는 Object 클래스에 정의된 메서드가 있음
상속의 관계는 is a (kind of) 관계라고 함.
SpiderMan과 Employee는 남남
단일 상속, Single Inheritance
- 만 지원
- 다중 상속의 경우 여러 클래스의 기능을 물려 받을 수 있으나 관계가 복잡...
- 대신 interface와 포함 관계(has a)로 단점 극복
포함 관계
- 상속 이외에 클래스를 재활용 받는 방법
- 2개 이상의 클래스에서 특성을 가져올 때 하나는 상속, 나머지는 멤버 변수로 처리
상속이냐 포함이냐 그것이 문제로다
- 문법적 문제가 아닌 프로젝트의 관점 문제
- 상속 : is a 관계가 성립하는가? => SpiderMan is a Person
- 포함 : has a 관계가 성립하는가? => SpiderMan has a Spider
메서드 재정의
메서드 오버라이딩, overriding
- 조상 클래스에 정의된 메서드를 자식 클래스에서 적합하게 수정하는 것
- 오버라이딩의 조건
- 메서드 이름이 같아야 한다.
- 매개 변수의 개수, 타입, 순서가 같아야
- 리턴 타입이 같아야
- 접근 제한자는 부모보다 범위가 넓거나 같아야 한다
- 조상보다 더 큰 예외를 던질 수 없다.
overloading => 추가
overriding => 재정의
super 키워드
- this를 통해 멤버에 접근했듯이 super를 통해 조상 클래스 멤버 접근
- 변수의 scope
- 사용된 위치에서 점점 확장해가며 처음 만난 선언부에 연결됨
- method 내부 => 해당 클래스 멤버 변수 => 조상 클래스 멤버 변수
- 생성자 또한 조상 클래스의 생성자 호출
- 조상 클래스에 선언된 멤버들은 조상 클래스의 생성자에서 초기화가 이뤄지므로 이를 재활용
- 자삭 클래스에 선언된 멤버들만 자식 클래스 생성자에서 초기화
- super() 또한 자식 클래스 생성자의 맨 첫 줄에서만 호출 가능
- 즉 생성자의 첫 줄에만 this() 또는 super()가 올 수 있다.
- 명시적으로 this()또는 super()를 호출하지 않는 경우 컴파일러가 super() 삽입
- 결론적으로 맨 상위의 Object까지 객체가 다 만들어지는 구조
super.shy();
Jeans jeans = new Jeans();
Annotation
- 사전적 의미: 주석
- 컴파일러, JVM, 프레임워크 등이 보는 주석
- 소스코드에 메타 데이터를 삽입하는 형태
- 소스코드에 붙여 놓은 라벨
- 코드에 대한 정보 추가 => 소스코드의 구조 변경, 환경 설정 정보 추가 등의 작업 진행
JDK 1.5 기본 annotation
- @Deprecated
- 컴파일러에게 해당 메서드가 deprecated 되었다 알려줌
- @Override
- 컴파일러에게 해당 메서드는 overrive한 메서드 임을 알려줌
- @override 가 선언된 경우 반드시 super class에 선언 되어있는 메서드여야 함.
- @SuppressWarnings
- 컴파일러에게 사소한 warning 무시하라고 알려줌.
Package
- 프로그램의 많은 클래스 => 패키지로 묶음
- 의미있는 이름
- .을 통해 접근
- package의 선언
- package package_name;
- 주석, 공백을 제외한 첫 번째 문장에 하나의 패키지만 선언.
- 모든 클래스는 반드시 하나의 패키지에 속한다.
- 생략 시 default 패키지에 속하는데 가급적 default 패키지는 사용 X
Import
- 다른 패키지에 선언된 클래스를 사용하기 위해 키워드
- 패키지와 클래스 선언 사이에
- 패키지와 달리 여러번 선언 가능
- 선언
- import 패키지명.클래스명;
- import한 package의 클래스 이름이 동일하여 구분이 필요할 때
- 클래스 이름 앞에 전체 패키지 명을 입력
- default import package
- java.lang.*
static import
- static member에 대한 import
제한자
제한자, modifier
- 클래스,변수,메서드 선언부에 함께 사용되어 부가적인 의미 부여
- 종류
- 접근 제한자 : public, protected, (default = package), private
- 그 외 제한자
- static, fianl ...
- 접근 제한자는 하나만 가능
- 순서는 무관
- 일반적으로 접근 제한자를 맨 앞으로
final
- 마지막, 더 이상 바뀔 수 없음
- final class : 더 이상 확장 할 수 없음 : 상속 금지 => 오버라이드 방지
- final method : 더 이상 재 정의 할 수 없음 : overriding 금지
- final variable : 더 이상 값을 바꿀 수 없음(상수)
- Blank fianl : 값이 할당되지 않은 멤버 변수
- final 멤버 변쉐 초기 값이 할당되어버리면 모든 객체는 같은 값을 사용해야 함.
- 객체가 생성되면 값을 변경할 기회가 없기 때문에 반드시 생성자에서 1회 초기화 가능
- static final
- 진정한 상수는 객체와 무관하게 모두가 공용하는 값, pi, E ...
11시반 - ...
대세의 흐름을 따라가자.
너무 작은 시장은 조금......
- 뛰어난 사람은 가능
기본 private로 필요한 부분 넓혀 가는 걸.
- 은닉성
그림으로 화살표를 그려서 이해해보실?
모름지기 함수는 무조건 반환.
- void 라도 반환.
C형은 메소드도 안 만듬.(왔다갔다도 런타임..) 하나의 메소드 안에 몽땅.
자바는 객체를..!
class Data{
int a,b;
int c;
void toAdd(int a,int b){
...
}
}
두 수 더하기.. 세 수 더하기 ..
- 각각 메소드 이름 달리하지 말고 메서드 오버로드.
static int doAdd(int... arr){
int sum = 0;
for(int data : arr){
sum+=data;
}
return 0;
}
...은 가변. 앞에 넣으면 받을 수 있음. (int a, int... arr)
객체를 생성하는 것을 => 인스턴스화 라고 한다.
불필요한 멤버 변수, 스태틱 변수는 사용하지 마라라..
- 반드시 공유되어야 할 때만.
- 알고리즘 때는 그냥 귀찮으니까 다 static 때려도..
- 현업에선 쓰면 왜 썼냐고 물어봄.
call by value.
- 자바는 레퍼런스가 아닌 value만 전달.
printf() 또는 String.format() 쓰셈.
- %d.. 로 받는 연습하세요.
String type은 객체이기에 메서드 안 에서 값 변경시 제대로 전달 안 될 수 있음.
- 새로운 객체를 만들고 거길 가르키기 때문. 그리고 메서드 종료 시 사라짐.
개발자가 불편하고 사용자가 편해야 함.
나 JAVA VAR A
OOP is A PIE. 객체지향은 파이 한 개 이다.
super 는 부모를 거슬러 간다. 없으면 또 그 위 부모로..
import.package이름.* => 실제로 사용 안 하면 컴파일러가 알아서 로딩 안 함.
- grouping 기법.
보충 19시-20시
싱글톤, Singleton
- 객체를 딱 하나. 만들어야 할 경우
- 무조건 암기
- 생성자 private
- static 붙이기..
- 달달달달 외우기
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
public class SingletonTest {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
}
}
가능하면 적게 사용하는 걸..
stack heap... c/java/python 똑같음
우클릭 => source > generate Constructor
- 자동 생성자 생성
주관식 문제 중에..
extends
java.lang.Object
.equals() 로 비교한다.
f3 눌러보면 소스코드 볼 수 있다.
오버로드
- 개수 / 순서 / 타입 중 하나만 다르면 됨
오버라이딩
- 파라메타 개수가 같음.
과제
System.out.println(String.format("%s_", str));
System.out.println(String.format("%12s_", str));
System.out.println(String.format("%-12s_", str));
System.out.println(String.format("%.2s_", str));
System.out.println(String.format("%-12.2s_", str));
System.out.println(String.format("%12.2s_", str));
%s는 문자열을 그대로 출력하고,
%s 앞에 숫자(N)를 설정할 경우, str.length()가 N보다 작을 경우 공백을 추가합니다. (ln 4~5)
- 를 붙일 경우, 왼쪽 정렬. (default는 오른쪽 정렬) (ln 5)
.숫자(N)를 설정할 경우, 최대 N길이 만큼만 출력 (ln 7~8)
출처 : https://blog.jiniworld.me/68
GPT4 코드 인터프리터
- 따라치기만 하는 것 x
- 생각하고 이해하고 큰 그림을 그릴줄 알아야.
이런 정보를 찾고 있었습니다, 감사합니다.