KOSTA 9일차) 복습

해버니·2023년 2월 26일
0

KOSTA

목록 보기
10/32
post-thumbnail

🌹 return 값은 "하나"만 반환이 가능하다.




🌹 함수 정의는 첫번째 줄에 있다.

int add(int a, int b){
	int c = a + b;
	return c;
}

→ 타입은 int이고 int 두 개를 파라미터 값으로 받는구나~





🌹 배열 형태의 함수는?


int[] f1(){
	return new int[3];
}






클래스

class Top{}

Top f2(){
	return new Top();
}

void f3(Top t1){

}





관계 (포함, 상속)

class Test{
	top t; // 포함관계. has a관계
}

extends Test{}  //  상속관계. is a관계





class 클래스명{
	// 구성요소
	멤버변수
	메서드
}

클래스 구성요소는 멤버 변수와 메소드로 이루어져 있다.




class Person{
	String name;
	int age;

	void setData(String name, int age){
		this.name = name;
		this.age = age
	}

	void printData(){
		System.out.println("name : ", name);
		System.out.println("age : ", age);
	}
}

this는 멤버 변수를 가져오고
멤버 변수와 파라미터를 구분하기 위해서 this를 쓴다.




name = name;
age = age;

이렇게 쓰면 파라미터 본인을 파라미터에다가 넣는 꼴과 같다.




vo : value object

객체 "한 개" 값 저장 → 캡슐화
하나의 객체가 갖는 여러가지의 값을 묶어주는 것
값 저장하기 위한 멤버변수와 값 셋팅하는 메서드(setter), 값 리턴하는 메서드(getter), 출력 메서드

class Member{
	private String id;
	private String pwd;
	private String email;
	private int type;
	
	public Member(){
	}

	public Member(String id, String pwd, String email, int type){
		this.id = id;
		this.pwd = pwd;
		this.email = email;
		this.type = type;
	}
	
	public void setId(String id){
		this.id = id;
	}
	public void setPwd(String pwd){
		this.pwd = pwd;
	}
	public void setEmail(String email){
		this.email = email;
	}
	public void setType(int type){
		this.type = type;
	}

	public String getId(){
		return id;
	}
	public String getPwd(){
		return pwd;
	}
	public String getEmail(){
		return email;
	}
	public Int getType(){
		return type;
	}

	@Override // 최상위 object에서 가져온다. 객체를 설명하는 메서드이다.
	public String toString(){
		return "id : " + id + "pwd : " + pwd + "email : " + email + "type : " + type;
	}
}











접근제어자

private → 멤버변수에 사용. 은닉성제공
default → 같은 패키지
public → 전체 오픈. 보통 메서드는 public
protected → 같은 패키지에서는 public 범위와 같고 다른 패키지에서는 상속관계에만 오픈




생성자의 특징은?

반환타입이 없고 클래스와 이름이 같다.
오버로딩이 가능하다.




생성자의 역할은?

객체 초기화. 멤버변수 초기화
설정해놓지 않으면 자동으로 초기화가 되는데
String은 null, int는 0, boolean은 false로 자동초기화

main(){
	Member m = new Member();
	m.id="aaa" // private이라 접근 불가
	// setter와 getter 필요
	m1.setId("aaa");
	System.out.println(m1.getId());

	Member m2 = new Member("bbb", "1111", "bbb@naver.com", 2);
	System.out.println(m2.getPwd());
}



클래스를 만든 목적?

생성하려고 (Member m = new Member();)


setter: 값을 넣는거 → 파람으로 받은 값을 멤버변수에 할당
getter: 값을 가져온다 → 멤버변수 리턴해주면 끝 -.-













메서드 오버로딩

동일한 이름의 메서드 여러 개 정의.
파라미터의 개수나 타입을 다르게 지정해야 함.

class Test{
	public int add(int a, int b){
		return a + b;
	}
	public String add(String a, String b){
		return a + b;
	}
	public float add(float a, float b){
		return a + b;
	}
}

public static void main(String[] args){
	Test t = new Test();	
	System.out.println(t1.add(1, 2));	
	System.out.println(t1.add("바닐라", "라떼"));	
	System.out.println(t1.add(1.11f, 2.22f));	
}




this
현재 객체 참조값. main에서 사용 못함.
클래스를 정의할 때, 즉, 객체 생성 전 객체를 부르는 이름이다.
보통 멤버변수지역변수를 구분하기 위해 사용한다.
근데 main에서는 객체를 생성하기 때문에 필요하지가 않다.


super

부모 객체 참조값. main에서 사용 못함.
언제 쓸까?
오버라이딩 전 메서드를 호출하고 싶을 때 사용한다.

@Override
public String toString(){
	String str = super.toString(); // 부모객체의 toString() 호출
	return id + " / " + pwd + " / " + email + " / " + type+ "\n" + str;
}




super()
부모의 생성자 호출
부모 생성자가 파람이 있을 때 super()로 전달.








밑 코드에서 어디가 잘못됐을까?

class Parent{
	int a;
	public parent(int a){
		this.a = a;
	}
}

class Child extends Parent{
	int b;
	public child(int b){
		this.b = b;
	}
}







class Parent{
	int a;
	public Parent(int a) {
		this.a=a;
	}
}

class Child extends Parent{
	int b;
	public Child(int a, int b) {
		super(a);
		this.b=b;
	}
}

이렇게 해줘야 한다.

Child를 생성하게되면 Child의 부모 생성자인 Parent가 먼저 생성되는데, 컴파일러는 Parent에 파라미터가 어떠한 값이 들어가게 되는지 알 수 없기 때문에 오류가 발생한다.
a에 값을 설정 안해줬으니까 알 수 없는 것이다.
그래서 Child에 부모 파라미터와 자식 파라미터를 받아와서 super(a);를 넣어줘야 Child가 생성이 가능해지는 것이다.











static

static 메모리에 할당
static 멤버 변수는 static 메모리에 할당되고 이 클래스로 만든 모든 객체들이 공유해서 사용을 한다.
그리고 객체 생성과 상관 없이 사용이 가능하고 "클래스명.멤버변수"로 표현을 한다.

static 메서드도 마찬가지로 객체 생성과 상관없이 사용이 가능하고 "클래스명.메서드"로 사용한다.
보통 상수 정의를 할 때 사용한다.

상수 : read-only
쓰기가 안돼서 대입 연산이 안됨.
그래서 선언시에 값을 할당해야 한다.
final static int MAX = 100;

static을 쓸일은 그렇게 많지 않다.











싱글톤

외부에서 객체 생성하는 것을 막는다.
자원관리 위하여
내부에서 객체 하나를 생성해서 이것을 공용으로 사용
→ 생성자를 private로
→ 내부에서 만든 객체를 static으로

class Test{
	private static Test t1 = new Test();
	private Test(){}
	public static Test getInstance(){
		return t1;
	}
// static은 객체 소속이 아니라 클래스 소속이다
// 그래서 main에서 쓸 수 있는 것이다.
}

main(){
	// Test 객체 생성
	Test t1 = new Test(); // 에러
	Test t1 = Test.getInstance();
}












🌹 객체는 변수 / 클래스는 타입

class Test{
	int a;		// 객체 소속
	static int b;	// 클래스 소속
}






🤍 상속 🤍

여러 클래스가 공통점이 있을 때 이 공통적인 필드를 뽑아서 상위 클래스로 만들고 이를 상속받도록 만드는 기법.
반복을 줄이고 코드 재사용성을 높이는 방법이다.

extends 부모{}

class A{
	int a;
	public void f1(){
		System.out.println(a);
	}
}

class B extends A{
	int b;
	public void f2(){
		super.f1();
		System.out.println(b);
	}

	@Override
	public void f1(){
		System.out.println(a);
		System.out.println(b);
	}
}	

→ B클래스가 A를 상속받음.
A 클래스의 (private과 생성자를 제외한) 멤버변수와 메서드를 물려받는다.
B는 멤버변수 a, b와 메서드 f1(), f2()를 갖는다.

다중상속 안 됨. 자식 여러 개는 가능, 여러 대를 내려오면서 상속 가능










🤍 메서드 오버라이딩 🤍

상속받은 메서드를 자식 클래스에 적합하게 수정해서 사용
메서드의 프로토타입은 그대로 두고 구현 내용만 수정

main(){
	A obj1 = new A();
	obj1.f1(); // 부모 메서드 f1() 호출됨. a만 출력

	B obj2 = new B();
	obj2.f1(); // 자식 메서드 f1() 호출됨. a, b 출력

	A obj3 = new B(); // 업캐스팅. 재정의된 메서드를 호출하면 자식꺼가 실행됨.
	obj3.f1(); // 자식 메서드 호출됨. a, b 출력
	obj3.a = 10; // 정상실행
	obj3.b = 20; // 에러 왜? 타입이 A라서 B클래스의 b는 사용 불가

	// 다운캐스팅. 업캐스팅된 놈을 원래 타입으로 내리는 캐스팅
	B obj4 = (B) obj3;
	obj4.b = 20;  // 정상실행. 다운 캐스팅해서 가능
	obj4.f2();
}

다운캐스팅 왜 쓰지?
(업캐스팅이 된 친구는 부모 행세를 한다.
근데 다시 자식의 기능을 쓰기 위해서 쓰는 것이다.)


업캐스팅된 객체는 타입이 부모라서 부모행세를 한다.
부모 클래스에 정의된 멤버변수와 메서드만 사용이 가능하다.
자식 클래스에 추가된 멤버변수와 메서드를 사용 못함
→ 이것들을 사용하고 싶을 때 다운캐스팅











🌹 예상 질문을 미리 미리 정리해놓기

🌹 면접도 연습이니까 안 보지 말고 보기.
떨리는 것도 덜하고 예상 문제가 나오니까 자신의 문제 은행이 나온다.

🌹 포트폴리오 만드는 기간 한 달 정도 걸리니 포맷 정해서 예제나 프로젝트 정리해놓기

🌹 공부할 때 눈으로만 하지 말고 직접 "치면서" 해봐야 한다. 그래야 는다!!!
포기하지 않고 하다보면 1년 안에 결과가 나온다.
앗 이거네! 라고 눈이 트이는 때가 있는데 그때까지 존버해야 한다.
그 시기가 오면 재미가 찾아온다.




0개의 댓글