인프런 커뮤니티 질문&답변

이원석님의 프로필 이미지
이원석

작성한 질문수

Java TPC 실전프로젝트 (Java API 활용)

지도 api 프로젝트 코드 문의

작성

·

275

0

강사님 안녕하세요.

project 1번 지도 api 프로젝트에서 문의 사항이 있어 글 남깁니다.

 

1) url 요청시에는 URLEncoder.encode(address, "UTF-8"); 과 같이 스페이스 처리를 위해 urlencoder로 변환을 해주는게 디폴트 인지요 ?

 

2)    HttpURLConnection con = (HttpURLConnection)u.openConnection();

이 코드가 좀 찾아보니 u.oepnConnection()이 URLConnection 타입으로 반환이 되던데,

URLConnection 클래스는 abstract class 인데 어떻게 저 코드가 동작하는지 이해가 안갑니다.

 

HttpURLConnection 클래스 타입을 사용하려면 저게 메모리에 올라와 있어야 하는데, u.openConnection()의 반환 타입은 abstract class 여서 메모리에 올라오지 않지 않나요 ? 

그리고 HttpURLConnectiondl URLConnection을 상속받고 있던데, 
다운 캐스팅의 경우 예를 들어, URLConnection, HttpURLConnection이 직접적으로 생성자를 부를 수 없게 되어 있지만 가능하다고 가정하고

 

URLConnection uc = new HttpURLConnection(); <- 업캐스팅

여기서,

HttpURLConnection hc = (HttpURLConnection)uc <- 다운캐스팅

 

이 때 다운캐스팅이 가능한 이유는 상속받은 클래스 객체가 메모리에 띄워져 있기 때문에 다운캐스팅도 가능한 걸텐데

 

HttpURLConnection con = (HttpURLConnection)u.openConnection();

 

이 코드에서는 openConection이 URLConnection 즉 상위 클래스를 반환하는데 어떻게 하위 클래스로 캐스팅이 되나요 ? 

 

답변 부탁드립니다.

 

감사합니다.

 

 

 

 

답변 3

0

박매일님의 프로필 이미지
박매일
지식공유자

u.openConnection() => 즉 openConnection()안에서 URLConnection, HttpURLConnection의 연결 관계가 미리 만들어집니다.  openConnection() 메서드를 우리가 구현을 하지 않아서 내부를 자세하게 볼수는 없지만 API를 설계할때 내부에 URLConnection, HttpURLConnection의 연결 관계가 만들어 지기때문에 HttpURLConnection con = (HttpURLConnection)u.openConnection(); 이부분이 가능하구요?
이해가 되셨을까요?

0

이원석님의 프로필 이미지
이원석
질문자

강사님 안녕하세요. 

u.openConnection() 이게 결국 반환하는 게 URLConnection 객체 아닌가요 ?

예를 들어, 부모 클래스가 animal 이고 상속받은 자식 클래스가 dog 라고 했을 때

 

new dog()로 객체를 생성하면 위의 그림처럼 부모 클래스의 객체와 자식 클래스의 객체가 함께 생성된다는 건

맞는데(상속 체인), new animal()로 객체를 생성하면 자식 클래스인 dog 객체는 메모리에 생성이 안되잖아요.

 

위의 예시처럼 보면 URLConnection이 부모 클래스(abstract) 이고 이걸  상속 받는 게 HttpURLConnection인데,

 

그림에 표현해주신 것처럼 u.openConnection() 이 URLConnection을 반환한다면 URLConnection이 부모 클래스이니까 부모클래스의 객체만 생성되는게 맞을 거 같은데요.

 

위의 그림만 보면 자식 클래스인 HttpURLConnection이 new 될 때 생성자에 super()이 디폴트로 되어 있고

여기서의 super()은 URLConnection이니 URLCOnnection도 메모리에 올라와서 오버라이딩의 형태로 활용이 된다일텐데,

 

부모 클래스가 객체로 생성이 되어도 자식 클래스도 자동으로 생성이 된다 (위에서 얘기한 것과 반대) 이건 아니지 않나요 ? 

 

Dog 클래스가 Animal 클래스를 상속받았습니다.

Animal dog = new Dog();

Dog dog2 = (Dog)dog; // 이건 당연히 가능

       Animal cat = new Animal();

Dog dog3 = (Dog)cat; // 여기서 에러 나는데

     당연히 여기서는 Animal 객체만 있고 Dog 객체는 메모리에 올라와 있지 않기 때문에 -->            (HttpURLConnection)u.openConnection(); 이 코드도 u.openConnection()이 상위 클래스인 URLConnection 객체를 만드는 거라면 이 코드에서는 하위 클래스 타입의 변수가 접근을 못하는 게 당연한 거 같은데요. (하위 클래스 객체는 없으므로)

System.out.println(dog2.a);

System.out.println(dog3.a);

 

답변 부탁드립니다.

감사합니다.

0

박매일님의 프로필 이미지
박매일
지식공유자

1) url 요청시에는 URLEncoder.encode(address, "UTF-8"); 과 같이 스페이스 처리를 위해 urlencoder로 변환을 해주는게 디폴트 인지요 ?

->주소에 한글이 있기 때문에 인코딩을 해야되서 반드시 해주어야 됩니다.

2) HttpURLConnection con = (HttpURLConnection)u.openConnection();

-> 메모리에 객체가 만들어 질때는 상속관계에 있는 모든 클래스가 자동으로 객체가 만들어 집니다.(상속체인)
그래서 u.openConnection(); 에서 URLConnection객체가 넘어올때(생성될때) 하위클래스인 HttpURLConnection 도 객체가 함께 만들어지기 때문에 이렇게  (HttpURLConnection)u.openConnection(); 다운케스팅이 가능합니다. 

아래 그림을 참조해보세요

 

 

 

이원석님의 프로필 이미지
이원석

작성한 질문수

질문하기