WIL

8주차

haedal-uni 2021. 11. 7. 01:00
728x90

토요일 새벽 2시부터 5시 30분? 넘어서까지 JAVA에 관해 팀원과 열린 토론을 했다. 

역시 불타는 금요일인가..🔥🔥🔥

팀원 면담에서 팀 목표를 정할 때 우리 팀이 issue에 관해 얘기를 하면 새벽 4시 넘어서 자는 일이 많아

새벽 3시안에는 잠을 자기로 했는데 아직도 못지키고 있다.ㅋㅋㅋㅋ

 

새벽 5시 30분에도 자바 공부하기🔥

 

처음에 이렇게 까지 하게 된 이유가 실강에서 아직 이해를 하지 못해서 팀원분에게 하소연(?)을 했는데

팀원분이 강의에서 이건 이렇게 한다라고 알려주면 나는 그 경우말고 또 뭐가 없을 까 이런 식으로

세세하게 파고들고 있다고 그냥 이건 이런거구나 하고 넘어가라 하셨다.😅

 

그러면서 여태껏 궁금한거를 말하면서 같이 공부를 했고 아래와 같이 정리했다.

아직 이게 맞게 이해한건지 검증은 하지 못했다. 다만 새벽까지 팀원분과 나눈 부분을 정리한 것이라고 보면 된다.

 

튜터님께 맞게 이해한건지 검증을 맡았고, 아래와 같은 피드백을 주셨다.

 

다형성을 어떻게 쓸 수 있다는 개념도 중요하지만 다형성을 왜 쓰는지 예시를 통해 아는 것,

다형성을 쓸 때와 안쓸 때는 코드적으로 어떤 차이가 생기는지 이해하는게 더 중요하다.

https://steady-coding.tistory.com/446 << 이 링크를 참고한다.

생성자는 정리를 잘했으며, 인터페이스는 상속자 참고 블로그 내용중에(참고하라고 주신 사이트)

사용하면 어떤 장점이 있는지 포함되어 있다.

상속관계 부분은 간략하게 정리해 놓으면 된다.
너무 깊게 들어가지 말고 부모의 메소드랑, 멤버변수를 상속받을 수 있고 오버라이딩을 해서 재정의 해서 쓸 수 있다,
그리고 부모형의 변수로 자식객체를 생성할 수 있다 정도로 정의 해주면 될것 같다.

너무 깊이 들어가면 한도 끝도 없는 것이다. 간략하게 정리하고 넘어가면 된다.

 

 

참고한 사이트는 점프 투 자바이다.

점프 투 자바, <05-4 상속>, https://wikidocs.net/280

점프 투 자바, <05-5 생성자>, https://wikidocs.net/281

 

 

 

 

 

다형성

객체들이 대체 가능성을 사용해서 설계 유연 재사용

 

나는 다형성을 상속과 연관된 개념으로, 

부모가 쌍둥이 자식을 낳으면 부모의 유전자가 두 명의 자식으로 재구성 되는 것과 같지만

두 쌍둥이(재구성된 객체들)의 유전자가 부모(원 개체)의 유전자와 똑같다고 볼 수는 없다.

라는 부분에 초점을 맞춰서 

 

NewCl이라는 클래스가 있다. 클래스에 있는 변수가 a와 b가 있다.

NewCla라는 클래스가 있다. a와 b를 받고 변수 c를 추가하고 싶다.

이럴경우 NewCl 클래스를 상속받은 후 NewCla 클래스에 변수 c를 추가한다.

ClaNew라는 클래스가 있다. NewCl 클래스를 상속받은 후 ClaNew라는 클래스에 변수 d를 추가한다.

같은 부모를 상속 받았지만 NewCla라는 클래스와 ClaNew라는 클래스는 같지 않다.

이것을 다형성이라고 한다. 라고 생각했는데 

 

팀원분은 다형성을 아래와 같이 생각하고 계셨다.

 

 

부모1과 부모 2가 있는데 자식 1이 부모1과 부모 2를 상속받는다.

 

다형성을 어떻게 이해해야하는지 모르겠다. 🤔

 

 

 

 

 

상속

부모클래스의 내부를 수정하려면 자식클래스에서 부모클래스의 내용을 상속받아서

자식클래스의 내용을 수정하면 되는거고
부모클래스의 내부를 수정할 내용이 없으면 상속을 하지 않고 부모클래스를 그대로 사용하면 된다.

public class NewCl {
    String a
    String b
}

부모 클래스가 있고 

아래와 같이 상속을 받는다.

public class NewClass extends NewCl {
    NewCl.a();
    NewCl.b();
    String c;
}

 

 

처음엔 상속 따로 변수 설정 따로 하는 줄 알았다.

public class NewClass extends NewCl {

}

 

public class NewClass{

    NewCl.a()

}

 

 

NewCl.a() 대신 

Class명 변수명 = new Class명()을 해서 사용할 수 있다.

NewClass st = new NewClass()

이렇게 하면 st.a()라고 할 수 있다.

 

 

그리고 st.a()에서 괄호 안은 부모 class에서 변수에 관한 함수를 설정했으면 괄호 안에 값을 적어야한다.

public class NewCl {
    String a;
    String b;
    
    public void name(String name) {
        this.a = name;
    }
}

 

public class NewClass extends NewCl {
    public static void main(String[] args) {
    
        NewClass puppy = new NewClass();
        puppy.name("lulu");
    }
}

puppy.name()처럼 빈 값을 넣으면 오류가 생긴다.

만약 NewClass에 있는 c변수도 입력 값을 받고 싶으면 위와 같은 방법으로 함수를 설정한다.

 

👉🏻 괄호 안에 값을 넣으려면 class 안에 함수를 설정해 받아올 값을 지정해야하고

     함수를 생성하지 않은 경우 빈 값으로 넣어야 한다.

 

 

 

 

 

생성자

클래스 이름과 같은 이름을 가진 메소드를 생성자라고 한다.

 

[클래스이름] [변수 이름] = new [클래스이름]();

new 생성자 이러면 생성자구나 하면 된다.

 

그러면 생성자 경우의 수는 2개이다.

 

public class name {
    public name()

}

or

new 생성자()

 

 

 

생성자 예시)

Course.java

public Course(String title, String tutor, int days) { //일반 생성자
}

 

Course course1 = new Course();
Course course2 = new Course("title01", "tutor01", 10);

 


 

public class Course {
    public String title;
    public String tutor;
    public int days;
    
   // 이렇게 아무런 파라미터가 없는 생성자를 기본생성자 라고 부른다.
    public Course() {
    }
    public Course(String title, String tutor, int days) {
      // this 는 "이것", 클래스 변수를 가리킨다.
        this.title = title;
        this.tutor = tutor;
        this.days = days;
    }
}

 

* 위 코드에는 생성자가 2개가 있다. (기본 생성자와 프로그래머가 생성한 일반 생성자)

  기본생성자를 넣은 이유는 기본 생성자와 일반 생성자 2개를 보여주기 위해서이다.

 

생성자가 아무것도 없으면 default 생성자라고 해서 Course() → 매개변수가 없는 생성자가 암묵적으로 생긴다.

그래서 생성자는 정의를 안해주어도 자바 내부에서 매개변수가 없는 생성자가 자동으로 생긴다

 

생각해보면 생성자가 없으면 클래스는 있지만 생성자가 없으니 객체를 만들지 못한다.

그래서 생성자가 없으면 자바에서 알아서 매개변수가 없는 생성자를 만들어준다.

이런 생성자를 default 생성자라고 한다.

원래 직접 작성해주어야 하는데 안 만들어주면 객체생성을 못하니까 자바에서 내용이 없는 

빈 깡통 생성자를 만들어준 것이다.

 

 

더 알아보기 👇🏻

더보기

 

class A {
    public A() {}  // 자바가 생성자가 없어서 default 생성자를 추가해줌
    public void print() {
        System.out.println("Hello");
    }
}

class Main {
    public static void main(String[] args) {
        A a = new A();
        a.print();
    }
}

 

 

 

 

 

 

손자.name의 값이 부모.name의 값에 들어가는가?

부모의 함수 setName을 썼고 손자의 setName 함수는 없으므로 부모의 this.name에 들어가지 않을까

라는 생각에 대해 의견을 공유했다.

 

public class Parent {
    String name;

    public void setName(String name) {
        this.name = name;
    }
}

 

public class Children extends Parent {
        Children child = new children();
        child.setName("pipi");
}

 

public class Baby extends Children {
    public static void main(String[] args) {
        Baby baby = new Baby();
        baby.setName("inging");
        baby.sleep();
    }
}

 

부모 - 자식 - 손자 관계에서

setName이라는 함수는 부모에서 설정된 함수이다.

그리고 손자 class에서 부모의 setName을 사용해 이름을 저장했다.

 

그런경우 손자의 name뿐만 아니라 부모 즉 Parent class에도 name 변수에 inging이 들어가는 것일까?

부모의 데이터는 자식이 상속 받을 때 가져가지 못하는 걸까?

 

확인해보기위해 코드를 실행해보려고 했는데 자꾸 오류가 떠서 실행시키지 못했다.

그 다음날에 다시 해보기로 했다.

 

 

 

 

 

인터페이스

인터페이스가 사물 간 또는 사물과 사용자 간의 의사소통이 가능하도록

일시적 혹은 영속적인 접근을 목적으로 만들어진 물리적, 가상적 매개체를 의미한다

 

java에서의 인터페이스는 클래스에서 멤버가 빠진, 메소드 모음집이라고 보면 된다.
이 말이 인터페이스의 기본 정의는 포함이 되나 정의가 더 추가 되면서 

java에서의 인터페이스는 또 다른 세세한 의미를 담고있는걸까?

 

인터페이스가 접점이며 서로 상호통신 한다

그러기 위해서는 서로 통신하기 위해서는 최소한의 모양이나 규약을 맺어 통신을 해야한다.

서로간의 약속을 맺어 통신을 하는 것.

 

자바에서 클래스끼리 통신을 하기 위해서는 인터페이스에 있는 메소드를 서로 구현했으면

서로 통신이 가능하도록 구현할 수 있는데

인터페이스의 메소드를 구현하면 서로 통신할 수 있도록 자바에서 인터페이스를 만든 것이다.

인퍼테이스의 메소드를 구현하면 서로 클래스의 형 변환이 가능한 것이다.

 

👉🏻 인터페이스가 서로 통신을 한다는 의미는 같지만 자바에서는 이러한 인터페이스가 메소드를 통해서 한다는 말

 

 

 

 

 

단축키 

System.out.println()을 일일히 적었었는데 단축키가 있었다.

sout + tab 키를 누르면 자동으로 생성된다.

 

main 메소드(함수)를 작성하는 단축키는

psvm + tab 키이다.

( public static void main(String[] args) )

 

 


* 자바는 한 파일당 하나의 클래스만 존재해 다양한 파일이 있을 수 있다.

그러므로 분석을 할 때 시작은 메인함수라고 보면 된다.

 

 

728x90

'WIL' 카테고리의 다른 글

10주차_Github 1년동안 1일 1커밋하기  (8) 2021.11.22
9주차  (0) 2021.11.15
7주차  (0) 2021.10.31
6주차  (0) 2021.10.24
5주차(35일차)  (0) 2021.10.16