본문 바로가기
프로그래밍/Web.

[JAVA] 내부 클래스가 컴파일되면?

by _Chavi 2020. 7. 8.

지난 포스트에서 작성했던 소스에 내부 클래스로 구현하였던 인증 세션 부분이 컴파일했을 때 어떤 식으로 변경되는지에 대하여 기록하려 합니다.

자동 배포 환경이 구축되어있지 않은 상황에서 바이트 코드가 누락되어 동작오류가 발생하였습니다.

 

JAVA Compile

우선 JAVA의 컴파일에 관하여 간략히 기록하겠습니다.

JAVA의 모토인 Write once, run everywhere(한번 작성, 어디서나 실행)에 따라 자바 소스는 JVM위에서 동작 가능한 상태인 Byte Code로 컴파일됩니다. 이때 Class 내부에 작성한 내부 클래스는 어떤 식으로 컴파일될까요?

 

Inner Class의 Byte Code

결과는 따로 컴파일된다 였습니다. 예제와 디컴파일한 Byte Code를 살펴보겠습니다.

// OuterClass.java 에서...
public class OuterClass {
  /** 생략 **/
  Session mailSession = Session.getDefaultInstance(props, new javax.mail.Authenticator(){
      protected javax.mail.PasswordAuthentication getPasswordAuthentication() {
          return new javax.mail.PasswordAuthentication(this.MAIL_ID, this.MAIL_PW);
      }
  });
  /** 생략 **/
}

 

위의 소스에서 추상 클래스인 Authenticator를 OuterClass.java내부에서 구현하였습니다. 그 결과...

이런 식으로 OuterClass.class와 OuterClass$1.class라는 이름을

위의 바이트코드들을 디컴파일해보겠습니다.

//OuterClass.class
public class OuterClass {
  /** 생략 **/
  Session mailSession = Session.getDefaultInstance(props, new 1());
  /** 생략 **/
}

기존 Authenticator를 구현하던 부분이 1이라는 객채를 생성하는 것으로 대치되었습니다.

//OuterClass$1.class
class OuterClass$1 extends Authenticator {
	protected PasswordAuthentication getPasswordAuthentication() {
		return new PasswordAuthentication("아이디", "비밀번호");
	}
}

OuterClass.java에선 하나로 합쳐져 있던 Class들이 분리되어 컴파일되었습니다.

메서드 내부에서 구현하여 매개변수로 넘기던 것이 하나의 Class로 상속받아 실행하도록 변경되었습니다.

 

위와 같이 수동 배포 환경이고, 개발 중 이너 클래스 및 무명 클래스를 사용하였다면 컴파일된 파일들을 꼼꼼히 살펴야 하겠습니다.

 

'프로그래밍 > Web.' 카테고리의 다른 글

[JAVA] IP 를 long 형으로 변환하기  (0) 2020.08.06
[JavaScript] Google 사이트번역 API 사용법  (1) 2020.08.05
[JAVA] SMTP 발송(feat.Naver)  (0) 2020.06.30
[JSTL] <c:set /> 사용법  (0) 2020.04.21
[JAVA] FindBugs 오류처리  (0) 2020.03.30

댓글