"안녕, 아미고!"
"또 다른 작은 주제는 지역 수업 입니다 ."
"보시다시피 별도의 파일뿐만 아니라 다른 클래스 내부에도 클래스를 생성할 수 있습니다. 하지만 그게 다가 아닙니다. 클래스는 메서드 내에서도 생성할 수 있습니다. 이러한 클래스를 로컬 클래스라고 합니다. 일반적인 내부 클래스처럼 작동하지만 선언된 메서드 내에서 사용할 수 있습니다."
"화면을 봐:"
class Car
{
public ArrayListcreatePoliceCars(int count)
{
ArrayList result = new ArrayList();
class PoliceCar extends Car
{
int policeNumber;
PoliceCar(int policeNumber)
{
this.policeNumber = policeNumber;
}
}
for(int i = 0; i < count; i++)
result.add(new PoliceCar(i));
return result;
}
}
"왜 그런 수업이 필요한가요?"
"모든 생성자와 메서드가 포함된 클래스를 메서드 안에 넣는 것은 코드를 매우 읽기 쉽게 만들지 않습니까?"
"그렇습니다. 당신 말이 절대적으로 옳습니다."
"메서드 내에서 익명의 내부 클래스를 사용할 수도 있습니다. 그러나 이러한 클래스에는 한 가지 작은 이점이 있으므로 결과적으로 메서드 내에서 자주 사용됩니다."
"메소드 내에서 선언된 클래스는 해당 메소드의 지역 변수를 사용할 수 있습니다."
class Car
{
public ArrayListcreatePoliceCars(int count)
{
ArrayList result = new ArrayList();
for(int i = 0; i < count; i++)
{
final int number = i;
result.add(new Car()
{
int policeNumber = number;
});
}
return result;
}
}
"하지만 한 가지 제한이 있습니다. 변수는 «읽기 전용»이므로 변경할 수 없습니다."
"제한 사항이 존재하는 이유는 다음과 같습니다."
"메서드 내에서 선언된 클래스는 final 키워드를 사용하여 선언된 메소드의 변수에만 액세스할 수 있습니다. 위의 예에서 i 값을 policeNumber에 즉시 할당할 수 없음을 알 수 있습니다. 대신 먼저 그것을 최종 변수 번호."
"메서드의 변수를 사용할 수 있다는 것은 정말 멋진 일입니다. 제대로 감사했으면 좋겠습니다. 하지만 변수를 변경할 수 없다는 것이 너무 안타깝습니다."
"오늘 엘리가 당신이 그것들을 바꿀 수 없는 이유를 설명할 것입니다. 그동안 저는 한 시간 정도 낮잠을 자러 갈 것입니다."
"잘자, 킴. 재미있는 수업 고마워."
GO TO FULL VERSION