7. 19

바르고·2023년 7월 19일
0

생성자


생성자
 - 객체를 생성할 때 호출하는 메서드 비슷한 것
   - 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) 관계라고 함.
SpiderManEmployee는 남남

단일 상속, 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 패키지명.클래스명;
  - importpackage의 클래스 이름이 동일하여 구분이 필요할 때
    - 클래스 이름 앞에 전체 패키지 명을 입력
  - 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 s = new Singleton(); ERROR
		//s.getInstance();
		Singleton s1 = Singleton.getInstance();
	}
}

가능하면 적게 사용하는 걸..
stack heap... c/java/python 똑같음


우클릭 => source > generate Constructor
  - 자동 생성자 생성

주관식 문제 중에..
extends
java.lang.Object // 반드시 O 대문자

.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
  - 생각하고 이해하고 큰 그림을 그릴줄 알아야.
profile
바르고의 다락방

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

이런 정보를 찾고 있었습니다, 감사합니다.

답글 달기