{{위키데이터 속성 추적}}
{{Infobox programming language
| name = AspectJ
| logo =
| caption = 
| paradigm = [[객체 지향 프로그래밍|객체 지향]]
| released = {{시작 날짜|2001}}
| designer =
| developer = [[이클립스 재단]]
| latest release version = {{wikidata|property|reference|edit|P348}}
| latest release date    = {{시작 날짜와 나이|{{wikidata|qualifier|P348|P577}}}}
| typing =
| implementations = [[이클립스 (소프트웨어)|이클립스]]를 위한 [[The AspectJ Development Tools]]
| dialects =
| influenced by =
| influenced =
| programming language = [[자바 (프로그래밍 언어)|자바]]
| operating system = [[크로스 플랫폼]]
| license = [[이클립스 퍼블릭 라이선스]]
| website = {{URL|http://www.eclipse.org/aspectj/}}
| file ext = aj
| wikibooks =
}}
'''AspectJ'''는 [[PARC]]에서 개발한 [[자바 (프로그래밍 언어)|자바]] 프로그래밍 언어용 [[관점 지향 프로그래밍]] (AOP) 확장 기능이다. [[이클립스 재단]] 오픈 소스 프로젝트에서 독립형 또는 [[이클립스]]로 통합하여 이용 가능하다. AspectJ는 최종 사용자를 위한 단순함과 이용성을 강조함으로써 폭넓게 사용되는 AOP에 대한 데 팍토 표준이 되었다. 자바 계열 문법을 사용하며 2001년 초기 출시 이후 [[횡단 관심사|횡단 구조]]를 표시하기 위한 IDE 연동을 포함하였다.

== 단순 언어 설명 ==
유효한 모든 자바 프로그램들은 유효한 AspectJ 프로그램들이기도 하지만 AspectJ는 프로그래머들이 [[관점 지향 소프트웨어 개발|관점]](aspect)이라 불리는 특수한 생성자를 정의한다. 관점들은 표준 클래스들에 이용할 수 없는 여러 엔티티를 포함할 수 있다. 이들은 다음과 같다:

;[[확장 메소드]](extension method): 프로그래머가 메소드, 필드, 인터페이스를 aspect 내의 기존 클래스들에 추가할 수 있게 한다. 이 예는 <code>acceptVisitor</code> ([[비지터 패턴]] 참고) 메소드를 <code>Point</code> 클래스에 추가한다:

:<syntaxhighlight lang="aspectj">
aspect VisitAspect {
  void Point.acceptVisitor(Visitor v) {
    v.visit(this);
  }
}
</syntaxhighlight>

;[[포인트컷]](Pointcut): 프로그래머가 [[조인 포인트]]를 지정할 수 있게 한다. 모든 포인트컷은 주어진 조인 포인트와 일치하는지를 결정하는 식이다. 이를테면, 포인트컷은 이름이 <code>set</code>으로 시작하는 <code>Point</code>형의 오브젝트의 임의의 인스턴스 메소드의 실행과 일치한다:

:<syntaxhighlight lang="aspectj">
pointcut set() : execution(* set*(..) ) && this(Point);
</syntaxhighlight>

;[[어드바이스]](Advice): 프로그래머가 [[포인트컷]]에 의해 일치되는 조인 포인트에서 실행할 코드를 지정할 수 있게 한다. 이 동작은 지정된 조인 포인트의 앞("before"), 뒤("after"), 주변("around")에서 수행할 수 있다. 여기에서 어드바이스는 위에 선언된 포인트컷을 사용하여 <code>Point</code> 상의 무언가가 설정될 때마다 화면을 새로 고친다:

:<syntaxhighlight lang="aspectj">
after () : set() {
  Display.update();
}
</syntaxhighlight>

또, AspectJ는 제한된 형태의 포인트컷 기반 정적 검사와 aspect 재사용(상속을 통해)을 지원한다. 언어의 더 자세한 설명에 대해서는 [http://www.eclipse.org/aspectj/doc/released/progguide/index.html AspectJ 프로그래밍 가이드] 참고.

== 역사 및 기여자 ==
[[Gregor Kiczales]]는 [[팰로앨토 연구소|PARC]] 팀을 시작, 주도하면서 최종적으로 AspectJ를 개발하였다. 그는 크로스커팅(crosscutting), 즉 "횡단"이라는 용어를 만들어냈다. 크리스 마에다(Crhis Maeda)는 관점 지향 프로그래밍(aspect-oriented programming)이라는 용어를 만들어냈다.
=== AspectWerkz ===
AspectWerkz는 [[자바 (프로그래밍 언어)|자바]]용의 가벼운 동적 고성능 [[객체 지향 프로그래밍|AOP/AOSD]] 프레임워크이다. AspectJ 프로젝트와 병합되었으며 AspectJ 5 이후로 AspectWerkz 기능을 지원한다.

== 같이 보기 ==
* [[관점 지향 프로그래밍]]
* [[스프링 프레임워크|스프링 AOP]] ([[스프링 프레임워크]]의 일부)
* [[관점 지향 소프트웨어 개발]]

== 참고 문헌 ==
{{참고 자료 시작}}
* {{인용
| first1    = Ramnivas
| last1     = Laddad
| title     = AspectJ in Action: Enterprise AOP with Spring
| date      = September 28, 2009
| edition   = 2nd
| publisher = [[Manning Publications]]
| pages     = 550
| isbn      = 978-1-933988-05-4
| url       =
}}
* {{인용
| first1    = Russ
| last1     = Miles
| title     = AspectJ Cookbook
| date      = December 20, 2004
| edition   = 1st
| publisher = [[오라일리 미디어]]
| pages     = 354
| isbn      = 978-0-596-00654-9
| url       = http://oreilly.com/catalog/9780596006549/
}}
* {{인용
| first1    = Adrian
| last1     = Colyer
| first2    = Andy
| last2     = Clement
| first3    = George
| last3     = Harley
| first4    = Matthew
| last4     = Webster
| title     = Eclipse AspectJ: Aspect-Oriented Programming with AspectJ and the Eclipse AspectJ Development Tools
| date      = December 24, 2004
| edition   = 1st
| publisher = [[:en:Addison-Wesley Professional]]
| pages     = 504
| isbn      = 978-0-321-24587-8
| url       = http://www.informit.com/store/product.aspx?isbn=0321245873
}}
* {{인용
| first1    = Joseph D.
| last1     = Gradecki
| first2    = Nicholas
| last2     = Lesiecki
| title     = Mastering AspectJ: Aspect-Oriented Programming in Java
| date      = March 7, 2003
| edition   = 1st
| publisher = [[:en:John Wiley & Sons|Wiley]]
| pages     = 456
| isbn      = 978-0-471-43104-6
| url       = http://www.wiley.com/WileyCDA/WileyTitle/productCd-0471431044.html
}}
{{참고 자료 끝}}

== 각주 ==
{{각주}}

== 외부 링크 ==
* [https://web.archive.org/web/20170811190325/http://www.eclipse.org/ajdt/ AJDT]
* Aspect bench : https://web.archive.org/web/20170816093700/http://www.sable.mcgill.ca/abc/
* [https://web.archive.org/web/20170805180224/http://www.eclipse.org/aspectj/ AspectJ Home Page]
* [https://web.archive.org/web/20060706114810/http://aspectwerkz.codehaus.org/ AspectWerkz Project homepage]
* [http://www.ibm.com/developerworks/java/library/j-aspectj Improve modularity with aspect-oriented programming]
* [http://java2novice.com/spring/aop-and-aspectj-introduction/ Spring AOP and AspectJ Introduction]
* [http://www.eclipse.org/aspectj/doc/released/progguide/index.html The AspectJ<sup>TM</sup> Programming Guide]
* Xerox has {{US patent|6467086}} for AOP/AspectJ, but published AspectJ source code under the [https://web.archive.org/web/20170811230223/http://www.eclipse.org/legal/cpl-v10.html Common Public License], which grants some patent rights.

{{관점 지향 소프트웨어 개발}}
{{이클립스 재단}}
{{기본정렬:Aspectj}}

[[분류:관점 지향 프로그래밍]]
[[분류:크로스 플랫폼 소프트웨어]]
[[분류:소프트웨어 배포]]
[[분류:자바 프로그래밍 언어 계열]]
[[분류:이클립스 라이선스 소프트웨어]]
[[분류:크로스 플랫폼 자유 소프트웨어]]
[[분류:관점 지향 소프트웨어 개발]]
[[분류:Eclipse (소프트웨어)]]
[[분류:고급 프로그래밍 언어]]