자바 인스턴스 이름을 불러오는 방법이 궁금합니다.

조회수 1705회
public class Car {
    public int gas; //누구나 접근이 가능한 필드
}
public class Suv extends Car{
    //자식클래스는 부모클래스의 gas 필드를 사용할 수 있다.

}
public class Truck extends Car{
//자식클래스는 부모클래스의 gas 필드를 사용할 수 있다.
}
public class Bus extends Car{
//자식클래스는 부모클래스의 gas 필드를 사용할 수 있다.

}
public class Test {
    public static void main(String[] args) {
        Test gasStation= new Test();
        Suv suv=new Suv();
        Truck truck = new Truck(); 
        Bus bus = new Bus();

        gasStation.fill(suv); //suv 기름넣기
        gasStation.fill(truck);//truck기름 넣기
        gasStation.fill(bus);//bus 기름 넣기
        System.out.println(suv.gas+truck.gas+bus.gas); 
        //3개는 모두 같은 변수 (부모클래스의 gas 필드값 (10)을 다같이 공유함)

    }


    public void fill(Car car){
        System.out.println(car.getClass().getSimpleName()+"에 기름을 넣습니다.");
        car.gas += 10;
        System.out.println("기름이 "+car.gas+"리터 들어있습니다.");
//      String name=~~ //suv, truck, bus를 불러오고 싶음.
//      System.out.println("현재 사용중인 지역변수명은 "+name+"입니다."); 
//      최종 목표는 부모클래스의 필드 car.gas으로 값을 넣지 않고 지역변수명을 불러와서 
//      각각 suv.gas, truck.gas, bus.gas로 값을 다르게 넣어주고 싶음
        }

}

여기서 필드명 gas의 값 10을 공유하지 않고 지역변수 이름 suv, truck, bus를 가져와서 원하는 결과값을 다음과 같이 나오게 하고 싶습니다. (suv.gas=10, truck.gas=20, bus.gas=30을 각각 대입하고 싶음)

Suv에 기름을 넣습니다.

기름이 10리터 들어있습니다.

Truck에 기름을 넣습니다.

기름이 20리터 들어있습니다.

Bus에 기름을 넣습니다.

기름이 30리터 들어있습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 아마도 질문이 확실히 이해는 안되지만 팩토리 메소드 패턴을 의미하는 것 같습니다.

    객체생성을 캡슐화하는 방법인데 보통 하위 클래스에 위임하는 패턴입니다.

    객체생성을 캡슐화하면 추상화를 더 높일 수 있다는 장점이 생깁니다. 즉 구체적인 클래스를 직접 이용하는 경우가 낮아집니다.

    public class CarType {
        public final static String CAR_SUV = "suv";
        public final static String CAR_TRUCK = "trcuk";
    }
    
    ...
    public Car createCar(String carType){
       if("suv".equals(carType)){ return new Suv(); }
       else if("truck".equals(carType)){ return new Truck(); }
       else { return null; }
     }
    ...
    Car car = createCar(CarType.CAR_SUV); // suv
    Car car = createCar(CarType.CAR_TRUCK); // truck
    
    fill(car)    // 질문의 fill 메소드 호출...car 는 suv 혹은 truck
    

    위와 같이 사용할 수 있습니다.

    • 감사합니다. 아직 자바에 확실히 익숙하지 않아서 질문이 모호했던 점 사과드립니다. 좋은 어드바이스 다시한번 감사인사 드리고 싶습니다 :) 알 수 없는 사용자 2018.6.18 05:33
  • 왜 공유라고 생각하죠?

    gas 는 공유된 변수가 아닙니다.

    공유되게 하려면 아래와 같이 static 변수여야 합니다.

    public class Car {
        public static int gas; //정적변수
    }
    

    static 이 아닌이상 각 인스턴스마다 각각 존재하는 변수입니다.

    원하는대로

    suv.gas=10, truck.gas=20, bus.gas=30
    

    와 같이 사용하면 됩니다.

    • 댓글 감사합니다. 하지만 제가 궁금했던 부분은 car.getClass().getSimpleName()나 Object(){}.getClass().getEnclosingMethod().getName()와 같은 내부 메소드를 사용하여 name에 이를 넣어주고 변수명인 suv,truck,bus를 각각 가져오고 싶다는 부분이었습니다. 혹시 이 부분에 대한 아이디어가 있으신가요? 알 수 없는 사용자 2018.6.17 16:39
    • 리플렉션이 궁금하다는 건가요? 좋은 답변은 좋은 질문에서 시작합니다. 질문을 잘해야 합니다. 본질문에는 없는 이야기를 댓글로 적고 궁금했던 부분은 다른 것이라고 하면 좋은 답변을 기대하긴 힘듭니다. 더구나 getSimpleName, getEnclosingMethod 메소드는 질문에 보이지도 않습니다. 질문을 구체적으로 다시 올려보시기 바랍니다. 정영훈 2018.6.18 02:43
    • 21번째 줄 String name에 메소드를 이용하여 각각 suv, truck, bus를 불러오고 싶습니다. 알 수 없는 사용자 2018.6.18 02:48

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)