
참조자료형 형변환 - 상속이 있어야 할 수 있습니다. - 부모는 자식을 모른다는 걸 명심해야 한다. 객체는 자식, 자료형은 부모 이렇게 이렇게 만든다. 예시 Class C { int a; } Class D extends C{ int b; } C c = new D(); // 업 캐스팅 D d = (D)c; // 다운 캐스팅 보는 방법은, 변수 자료형 타입(기준)으로 보면 된다. D로 만들고 C로 갔다. => 내가 볼 수 있는 건 C밖에 없다. 그 말은 C일 때 int b가 안 보인다는 것. 다시 D로 다운캐스팅 해주면? int b가 보인다. 즉, 부모 입장에서는 부모에 있는 것만 보이는 것이고, 자식은 부모 것도 다 가지고 있으니까, 전부 보인다. 왜 쓰는가? 이러한 관계가 있다고 가정했을 때, Class..
super - 상속에서 부모의 것을 의미함. - 부모 클래스의 생성자를 자식 클래스 생성자에서 활용할 때 필요함. super() super는 상속받은 부모 클래스에 대한 레퍼런스 변수 => 부모 클래스 멤버에 접근할 때 사용하는 키워드 / 자식 클래스의 모든 생성자는 부모 클래스 생성자를 포함하고 있어야 하는데, 그렇지 않은 경우 자바 컴파일러가 사실 자동으로 부모 클래스의 기본 생성자를 호출해준다. (만약, 부모 클래스에 기본 생성자가 없다면, 에러 부모 클래스 super. > 부모생성자 부모클래스() // 부모의 생성자 super.abc() // 부모의 메소드 super.a // 부모의 멤버 변수 또 예시 class A { A(int a) { } } class B extends A { B() { su..

상속 - 일반적으로, 부모가 자식에게 물려주는 것. - 자식 입장에서는 부모 것을 가져오는 것. 통념상 부모가 자식보다 범위가 크다고 여기고 있지만, 그렇기는 하죠... 자바에서는 자식이 사이즈가 더 크다!!! 상속을 왜 쓰죠? - 코드 재사용성이 좋아집니다. - 부모의 것을 받아 쓰고 + 내것 을 추가 할 수 있습니다.(확장) (상속의 움직이는 단위는 무조건 class) : 일단 현재까지는. 매우 단순한 기본 형태 Class A{ // 부모 } Class B extends A{ // A클래스 자식 } 상속의 특징 1. 클래스를 체계화 할 수 있다. 2. 확장이 가능하다. 3. 기존 클래스의 기능을 쉽게 변경할 수 있다 => 오버라이딩 상속과 관련한 자바 언어의 특징 * 다중상속을 지원하지 않는다. * ..
오버로딩 - 생성자 또는 메소드에 해당 - 생성자명과 메소드명을 똑같이 하고 매개변수의 차이로 호출하는 구조를 만드는 것 - 리턴 타입은 무관하다 개발 => 생성 + 사용인데, 이 메서드 오버로딩 개념은 사용에 초점을 맞추는 것이다. 1. 메서드 오버로딩 ex. int add(int a, int b){ return a + b; } double add(double a, double b){ return a + b; } 이렇게 되어 있으면, main에서 메서드를 출력하려면 add(5,10) add(2.0,3.0) 이게 다 가능하다는 소리 ex2. 기준 : int add(int a, int b) 라고 하면 메서드 오버로딩 기준으로 double add(int c, int d) // X int add() // O ..
import java.util.Random; class Player { int num; //레인번호 String country; // 국가 int m; // 전진거리 Player(int num, String country) { // 생성자 => 레인번호, 국가 this.num = num; this.country = country; } void runAndCheck(int num, Random r) { // 이동거리(전진) 실행 메서드 // 밖에서 레인번호만 알려주면 된다. if (num != this.num) { //돌발 레인번호와 내 레인번호가 일치하지 않으면ㅇ m += r.nextInt(10) + 1; // 전진(전진거리에 이동거리만큼을 누적) } System.out.println(country + ..

코드 class C { int a; D d; } class D { String str; } public class HasTest { public static void main(String[] args) { C c = new C(); //1 c.d = new D(); // 2 c.d.str = "안녕하세요~~~"; //3 c.a = 10; //4 System.out.println(c.a +c.d.str ); // 5 } } C c = new C(); c.d = new D(); c.d.str = "안녕하세요~~~" c.a = 10; 따라서 System.out.println(c.a +c.d.str ); 는 10안녕하세요~~~ 출력.

Case1 B makeB(){ b = new B(); //B 객체를 생성 선언되어 있는 변수 b에 대입 return b; } 매번 makeB()를 하면 new를 해서 b를 만든다. 새로운 객체를 매번 넣어준다는 소리다. 클래스 B에 있는 k는 객체에 붙는다. (static 없으므로) 1)에서 a 객체를 만들고 2)에서 a에서 makeB()를 한다. 이 때 B라는 객체가 생길 것이고, 그 결과를 b1이라는 변수에 저장. 즉 b1과 B 객체가 연결 3)에서 b1을 타고 들어와서 k에 10 값을 대입. 4)는 a를 통해서 b에 접근해서 b에 있는 k에 20을 대입. 즉, b1.k와 a.b.k는 위치가 같다. 지금 위 그림에선 편의를 위해 노란색 상자 B를 A 내부에 집어넣은 것처럼 표현했지만, 사실 정확히 말..

// 주석참고!!! package megait.backend_lecture.Day19; class B { } class C { B[] b = new B[5]; //멤버변수 has 관계 (변수만 있으면 Has관계 가능하다) // 그러면 당연히 배열도 가능한 것이다. } class D { //has 관계?? 아니다! // 멤버변수로 갖는 거랑 메서드로 부르는 거랑 차이가 있으므로 // 내가 실제로 가지고 있어야 한다. B make(B[] b) { b[2] = new B(); return b[2]; } } class E { D[][] d = new D[3][3]; /* D[][] sendD(D[][][] d, int i, int j, int k) { return d[0]; // 자료형으로 받고 싶은 만큼 뒤에..