Java 객체지향 Study 3회차

Geun Bo Kim·2023년 4월 11일
0

스터디

목록 보기
4/6
  1. Dog란 이름의 클래스를 만들고 name과 age를 매개변수로 받는 생성자를 만들고 introduce라는 메서드를 생성해 name과 age를 출력하도록 구현하세요. 또한 main 클래스에서 Dog 클래스를 인스턴스화 하고 introduce 메서드를 사용하세요.
    • 신동현(답변자)
      public class Dog {
          private String name;
          private int age;
      
          public Dog(String name, int age) {
              this.name = name;
              this.age = age;
          }
      
          public void introduce() {
              System.out.println("name " + name + "age" + age);
          }
      }
      
      public class Main {
          public static void main(String[] args) {
              Dog dog = new Dog("Dog", 10);
              dog.introduce(); // name Dog age 10
          }
      }
    • 김은양(질문자) 생성자에 this 없는채로 만들었는데도 값이 잘 출력되었다. 굳이 this를 넣어서 만들어 주는 이유가 있나? 김은서 만약 인스턴스 메서드가 많이 존재한다면, 그 메서드를 하나씩 부를 때 마다 계속 인자값으로 넣어줘야 하는 번거로움이 발생한다. 장정아 this를 쓰는 이유는 효율의 문제가 아닌, Object와 클래스 안에 있는 특징을 구별해주기 위해 this를 쓴다. 은서님 코드를 보면, main영역에서는 이름이 없는 누리고, Dog로 만들어지는 순간 dog의 누리가 되는 것이다. 떠돌아 다니는 Object의 개념이 아니라, Dog 객체에 이름을 붙혀주는 개념이다.
  2. 생성자는 인스턴스화 할 때 매개변수를 받아 클래스의 필드를 초기화 하기 위해 쓰입니다. 그렇다면 생성자 오버로딩은 왜 하는 것인가요?
  • 김근보(답변자)
    • 코드의 재사용성과 유연성을 높이기 위해 사용
    • 오버로딩은 생성자를 하나만 정의하면 매개변수의 개수나 타입만 달리하면 유연하게 쓸 수 있음
    • 생성자 오버로딩과 메서드 오버로딩의 차이점 (1) 생성자 오버로딩 : 생성자의 이름이 동일하고 매개변수의 개수나 타입이 다른 경우 반환값 : 생성자는 반환값이 없음 목적 : 생성자는 객체를 생성할 때 호출되어 객체의 초기화를 담당 호출 : 생성자는 new 키워드를 사용하여 객체를 생성할 때 자동으로 호출 (2)메서드 오버로딩 : 메서드의 이름이 동일하고 매개변수의 개수나 타입이 다른 경우 반환값 : 있을 수도 없을 수도 있음 목적 : 메서드는 객체가 가지고 있는동작을 구현(다양한 매개변수 조합에 대해 하나의 이름으로 메서드를 사용할 수 있도록 하는 것) 호출 : 개발자가 직접 호출
  • 김은서(질문자) 메서드 오버로딩에서 다른 조건들은 같을 때, 반환타입만 다르면 오버로딩이 될까? 김은양 이름만 같을 때는 구별이 어렵다. 구별 하는 것을 매개변수로 뭘 받냐로 구분할 수 있기 때문에 매개변수 개수나 타입이 달라야 호출할 수 있다. 그렇기 때문에 오버로딩이 안된다.
  • 신동현(질문자) A 클래스가 있는데, 이 클래스 안에 있는 인스턴스로 생성자를 만들 수 있을까? 장정아다른 클래스의 인스턴스를 사용하기 위해서는 상속관계일 때 생성자 만들 수 있다. 김건일반적인 포함관계에서는 생성 가능하다.
  1. 표를 완성하세요. (각 접근제어자가 변수 / 메서드에 붙을 때, 클래스에 붙을 때, 생성자에 붙을 때 어떻게 되는지) (예시: private이 붙은 변수 - 클래스 내부에서만 접근이 가능하고 외부에서의 접근은 불가하다.)
접근제어자변수 / 메서드클래스생성자
public어디서든 가능하다
default같은 패키지에서만 가능
private같은 클래스에서만 접근 가능
  • 김은서(답변자) 평소 코드를 작성할 때, private로 해놓고 open 시키고 싶은 친구들만 점점 위로 올라가게 해라
  1. 다음은 접근제어자가 생략된 코드입니다. 해당 코드는 가능한 한 최대한 폐쇄적으로 만들려 합니다. 위치에 맞게 알맞은 접근제어자를 채워 넣으세요.
public class Gombo{

    String name = "김근보"; //접근제어자 추가
    int age = 13; //접근제어자 추가

    void printInfo(){ //접근제어자 추가
        System.out.println("이름: " + name);
        System.out.println("나이: " + age);
    }

    public static void main(String[] args) {

        Gombo gombo = new Gombo();

        gombo.printInfo();
    }
}
  • 고예진(답변자)
    public class Gombo{
    
        private String name = "김근보"; //접근제어자 추가
        private int age = 13; //접근제어자 추가
    
        private void printInfo(){ //접근제어자 추가
            System.out.println("이름: " + name);
            System.out.println("나이: " + age);
        }
    
        public static void main(String[] args) {
    
            Gombo gombo = new Gombo();
    
            gombo.printInfo();
        }
    }
  1. 다음과 같은 코드를 실행하려고 합니다. 그런데 해당 코드에서는 컴파일 에러가 발생합니다. 어떤 컴파일 에러가 발생할까요?
public class Go{

    String name = "고예진";
    int age = 10;

    void printAge(){
        System.out.println(age);
    }

    static void printName(){
        System.out.println(name);
    }

    static void printInfo(){
        printName();
        printAge();
    }

    public static void main(String[] args) {
        Go go = new Go();
    }
}
  • 장기웅(답변자) printName()은 static 메서드인데, 인스턴스 변수를 사용하려다 보니 에러가 발생 printAge(), printName()에서 에러가 발생
  • 김은서(질문자)
    • printName(), printAge()에서 오류가 발생하여 static 메서드에서 인스턴스 사용할 수 없는 것 것을 의도했음

    • static을 사용하지 않고 name을 사용하려면 어떻게 작성해야하는가? → 인스턴스화 해야한다

      public class Go {
      
          String name = "고예진";
          int age = 10;
      
          void printAge(){
              System.out.println(age);
          }
      
          static void printName(){
              Go go = new Go();
              System.out.println(go.name);
          }
      
          static void printInfo(){
              printName();
              Go go = new Go();
              go.printAge();
          }
      
          public static void main(String[] args) {
      
              Go go = new Go();
      
          }
      }
  1. 다음은 생성자를 정의하고 있는 클래스입니다. 해당 클래스에서 빈 칸을 채우세요.
public class Sheep {
    String A;
    
    Sheep(String B){
        this.(빈칸) = (빈칸);
    }
}
  • 김은양(답변자)
    public class Sheep {
     
        String A;
    
        Sheep(String B) {
            this.A = B;
        }
    }
  • 김은서(질문자)
    • 필드와 생성자로 받는 매개변수가 이름이 달라도 괜찮다는 걸 말하고 싶었음
    • 생성자가 이러한 과정을 통해 돌아간다는 것을 보여주기 위해 가져왔음
  • 송우근(질문자)
    • this를 빼도 상관은 없나?
      김은양 빼도 상관은 없지만, 변수가 많아지면 문제가 생길 수 있음
profile
미래는 개발이다

0개의 댓글