오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터
(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)
c의 union을 java 클래스 계층구조로…
c의 union은 한가지 타입 이상의 자료를 저장 하기 위한 구조체를 정의하기 위한 것입니다.
이런 구조체는 보통 최소한 union과 tag라는 두 개의 필드를 가지는 데 tag는 union이 어떤 타입을 가지고 있는지를 알려주는 필드로 보통 enum형 입니다. union과 tag 필드를 가진 union을 특별히 식별자가 있는 union(discriminated union) 이라고 부릅니다.
아래의 C코드에서 shape_t 타입은 직사각형과 원 중에 하나를 표현할 수 있는 union 이며 area 함수는 shape_t에 대한 포인터를 인자로 받아 면적을 리턴 하는데 이때 구조체가 유효하지 않으면 -1.0을 리턴 합니다.
---------------
[shape.c]
---------------
/* Discriminated union */
#include "math.h"
typedef enum {RECTANGLE, CIRCLE} shapeType_t;
typedef struct {
double length;
double width;
} rectangleDimensions_t;
typedef struct {
double radius;
} circleDimensions_t;
typedef struct {
shapeType_t tag;
union {
rectangleDimensions_t rectangle;
circleDimensions_t circle;
} dimensions;
} shape_t;
double area(shape_t *shape) {
switch(shape->tag) {
case RECTANGLE: {
double length = shape->dimensions.rectangle.length;
double width = shape->dimensions.rectangle.width;
return length * width;
}
case CIRCLE: {
double r = shape->dimensions.circle.radius;
return M_PI * (r*r);
}
default: return -1.0; /* Invalid tag */
}
}
int main() {
shape_t rectangle, circle;
rectangle.tag = RECTANGLE;
rectangle.dimensions.rectangle.length = 2.0;
rectangle.dimensions.rectangle.width = 3.0;
printf("Rectangle area: %f\n", area(&rectangle));
circle.tag = CIRCLE;
circle.dimensions.circle.radius = 1.0;
printf("Circle area: %f\n", area(&circle));
return 0;
}
C코드는 이상과 같지만 자바에서는 다양한 종류의 객체를 하나로 표현할 수 있는 타입을 정의하는 서브타이핑(subtyping)이라는 좋은 방법이 있으므로 unoin을 더 이상 제공하지 않습니다. 식별자가 있는 union이란 결국 클래스의 계층 구조로 정의 되는 것입니다.
식별자가 있는 union을 클래스 계층구조로 전환하기 위해서는 tag 값에 다라 달라지는 행동들을 추상 메소드로 표현한 추상 클래스로 정의해야 합니다. (area 메소드)
만약 tag값과 관계없는 공통적인 행동이 있다면 최상위 추상 클래스의 메소드로 만들어야 하며 tag와 union을 제외한 필드가 있다면 이 역시 최상위 추상 클래스의 필드로 만들어야 합니다.
아래의 Java Code는 union이 표현할 수 있는 각 타입을 추상 클래스를 상속 받는 Circle, Rectangle 클래스로 각각 정의 합니다. 그런 다음 각 하위 클래스별로 필요한 필드를 정의하고 추상 클래스의 area 메소드를 각 클래스에 맞게 구현 하면 됩니다.
아래의 코드를 확인 하세요~
--------------------
Shape.java
--------------------
abstract class Shape {
abstract double area(); //
}
class Circle extends Shape {
final double radius;
Circle(double radius) { this.radius = radius; }
double area() { return Math.PI * radius*radius; }
}
class Rectangle extends Shape {
final double length;
final double width;
Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
double area() { return length * width; }
}
// Page 102
class Square extends Rectangle {
Square(double side) {
super(side, side);
}
double side() {
return length; // or equivalently, width
}
}
----------------------
ShapeTest.java
----------------------
public class ShapeTest {
public static void main(String args[]) {
Shape rectangle = new Rectangle(2.0, 3.0);
Shape circle = new Circle(2.0);
Shape square = new Square(15.0);
System.out.println("Rectangle area: " + rectangle.area());
System.out.println("Circle area: " + circle.area());
System.out.println("Square area: " + square.area());
}
}
클래스의 계층 구조는 union 보다 많은 장점이 있습니다. 특히 클래스 계층 구조로 표현 시 타입의 안정성을 보장할 수 있다는 장점이 있습니다. 예를 들어 모든 Shape 인스턴스는 유효한 Circle이 아니면 Rectangle 입니다.
이전의 식별자를 가진 union은 tag와 union사이의 관계를 언어 자체에서 묶을 수 없으므로 엉터리 shape_t 구조를 만들 수도 있습니다. 즉 tag는 직사각형에 해당하는 값을 가지면서 union은 원의 정보를 가질 수도 있다는 이야기 입니다. (엉터리로 만들어도 컴파일 시점에 에러를 알지 못합니다.)
또한 클래스 계층구조는 코드가 단순, 명료하다는 장점이 있습니다.
세번째 장점은 클래스 계층구조는 확장이 용이한 점입니다. 확장하는 경우 새로운 하위 클래스 하나만 추가하면 되죠… 또한 상위 추상 클래스의 추상 메소드는 반드시 구현하도록 컴파일 시점에 지적을 해줍니다. 만약 식별자를 가진 유니온을 이용했다면 소스 코드부터 고쳐야 합니다. enum 타입에 새로운 타입을 추가하고 switch 문마다 새로운 case를 추가하고, 컴파일까지 다시 해야 합니다.
정사각형이 직사각형의 특수한 형태(하위 구조, 하위 클래스)라는 것은 아래와 같은 소스 코드로 간단히 반영할 수 있습니다. (반대는 일반화…즉 정사각형을 일반화 하면 직사각형 입니다. 정사각형은 완벽한 직사각형이지만 직사각형은 아니죠^^)
class Square extends Rectangle {
square(double side) {
super(side, side);
}
double side() {
return length;
}
}
c의 union은 한가지 타입 이상의 자료를 저장 하기 위한 구조체를 정의하기 위한 것입니다.
이런 구조체는 보통 최소한 union과 tag라는 두 개의 필드를 가지는 데 tag는 union이 어떤 타입을 가지고 있는지를 알려주는 필드로 보통 enum형 입니다. union과 tag 필드를 가진 union을 특별히 식별자가 있는 union(discriminated union) 이라고 부릅니다.
아래의 C코드에서 shape_t 타입은 직사각형과 원 중에 하나를 표현할 수 있는 union 이며 area 함수는 shape_t에 대한 포인터를 인자로 받아 면적을 리턴 하는데 이때 구조체가 유효하지 않으면 -1.0을 리턴 합니다.
---------------
[shape.c]
---------------
/* Discriminated union */
#include "math.h"
typedef enum {RECTANGLE, CIRCLE} shapeType_t;
typedef struct {
double length;
double width;
} rectangleDimensions_t;
typedef struct {
double radius;
} circleDimensions_t;
typedef struct {
shapeType_t tag;
union {
rectangleDimensions_t rectangle;
circleDimensions_t circle;
} dimensions;
} shape_t;
double area(shape_t *shape) {
switch(shape->tag) {
case RECTANGLE: {
double length = shape->dimensions.rectangle.length;
double width = shape->dimensions.rectangle.width;
return length * width;
}
case CIRCLE: {
double r = shape->dimensions.circle.radius;
return M_PI * (r*r);
}
default: return -1.0; /* Invalid tag */
}
}
int main() {
shape_t rectangle, circle;
rectangle.tag = RECTANGLE;
rectangle.dimensions.rectangle.length = 2.0;
rectangle.dimensions.rectangle.width = 3.0;
printf("Rectangle area: %f\n", area(&rectangle));
circle.tag = CIRCLE;
circle.dimensions.circle.radius = 1.0;
printf("Circle area: %f\n", area(&circle));
return 0;
}
C코드는 이상과 같지만 자바에서는 다양한 종류의 객체를 하나로 표현할 수 있는 타입을 정의하는 서브타이핑(subtyping)이라는 좋은 방법이 있으므로 unoin을 더 이상 제공하지 않습니다. 식별자가 있는 union이란 결국 클래스의 계층 구조로 정의 되는 것입니다.
식별자가 있는 union을 클래스 계층구조로 전환하기 위해서는 tag 값에 다라 달라지는 행동들을 추상 메소드로 표현한 추상 클래스로 정의해야 합니다. (area 메소드)
만약 tag값과 관계없는 공통적인 행동이 있다면 최상위 추상 클래스의 메소드로 만들어야 하며 tag와 union을 제외한 필드가 있다면 이 역시 최상위 추상 클래스의 필드로 만들어야 합니다.
아래의 Java Code는 union이 표현할 수 있는 각 타입을 추상 클래스를 상속 받는 Circle, Rectangle 클래스로 각각 정의 합니다. 그런 다음 각 하위 클래스별로 필요한 필드를 정의하고 추상 클래스의 area 메소드를 각 클래스에 맞게 구현 하면 됩니다.
아래의 코드를 확인 하세요~
--------------------
Shape.java
--------------------
abstract class Shape {
abstract double area(); //
}
class Circle extends Shape {
final double radius;
Circle(double radius) { this.radius = radius; }
double area() { return Math.PI * radius*radius; }
}
class Rectangle extends Shape {
final double length;
final double width;
Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
double area() { return length * width; }
}
// Page 102
class Square extends Rectangle {
Square(double side) {
super(side, side);
}
double side() {
return length; // or equivalently, width
}
}
----------------------
ShapeTest.java
----------------------
public class ShapeTest {
public static void main(String args[]) {
Shape rectangle = new Rectangle(2.0, 3.0);
Shape circle = new Circle(2.0);
Shape square = new Square(15.0);
System.out.println("Rectangle area: " + rectangle.area());
System.out.println("Circle area: " + circle.area());
System.out.println("Square area: " + square.area());
}
}
클래스의 계층 구조는 union 보다 많은 장점이 있습니다. 특히 클래스 계층 구조로 표현 시 타입의 안정성을 보장할 수 있다는 장점이 있습니다. 예를 들어 모든 Shape 인스턴스는 유효한 Circle이 아니면 Rectangle 입니다.
이전의 식별자를 가진 union은 tag와 union사이의 관계를 언어 자체에서 묶을 수 없으므로 엉터리 shape_t 구조를 만들 수도 있습니다. 즉 tag는 직사각형에 해당하는 값을 가지면서 union은 원의 정보를 가질 수도 있다는 이야기 입니다. (엉터리로 만들어도 컴파일 시점에 에러를 알지 못합니다.)
또한 클래스 계층구조는 코드가 단순, 명료하다는 장점이 있습니다.
세번째 장점은 클래스 계층구조는 확장이 용이한 점입니다. 확장하는 경우 새로운 하위 클래스 하나만 추가하면 되죠… 또한 상위 추상 클래스의 추상 메소드는 반드시 구현하도록 컴파일 시점에 지적을 해줍니다. 만약 식별자를 가진 유니온을 이용했다면 소스 코드부터 고쳐야 합니다. enum 타입에 새로운 타입을 추가하고 switch 문마다 새로운 case를 추가하고, 컴파일까지 다시 해야 합니다.
정사각형이 직사각형의 특수한 형태(하위 구조, 하위 클래스)라는 것은 아래와 같은 소스 코드로 간단히 반영할 수 있습니다. (반대는 일반화…즉 정사각형을 일반화 하면 직사각형 입니다. 정사각형은 완벽한 직사각형이지만 직사각형은 아니죠^^)
class Square extends Rectangle {
square(double side) {
super(side, side);
}
double side() {
return length;
}
}
[개강확정강좌]
[평일저녁9/24]iPhone 하이브리드 앱 개발 실무과정
[평일저녁9/26]Spring3.X, MyBatis, Hibernate실무과정 
[주말9/28]웹퍼블리싱 마스터 
오라클자바커뮤니티 추천 실무 개발자 과정 - 개인80%환급
Spring3.X, MyBatis, Hibernate실무과정
| 강좌명 | Spring3.X, MyBatis, Hibernate실무과정(주말주간(토/일)) 오라클자바커뮤니티(www.oraclejavanew.kr) 추천 실전강좌 |
|---|---|
| 교재 | 자체교재 or PDF 파일제공 |
| 강좌 일정 | 09월14일(토) ~ 10월05일(토)((주말주간(토/일)) 10:00~18:00, 5일) 총 35시간 |
| 강의 장소 | [A강의장]구로디지털단지역2번 출구-> 미니스톱끼고 우회전 -> 100m 직진 후 골목길 끝에서 이마트방향 우회전 -> 50m 직진 후 우체국 옆골목으로 길건너서 직진 -> 150미터 직진 후 JnK 타워에서 우회전 -> 50미터 직진 후 우측에 코오롱빌란트2차 803호 (구로구 구로3동 222-8 코오롱디지털타워 빌란트2차 803호) [약도보기] |
| 수강절차 | - 강좌내용 확인 - 전화 또는 홈페이지(www.onjprogramming.co.kr)를 통한 수강지원 및 수강료 결제(무통장입금, 온라인 카드결제) - 고용보험 가입자(재직자)인 경우 고용보험환급 관련 서류 제출 - 수강전 : 커리큘럼 및 장소에 대해 다시 한번 공지 - 교육 전 설문 작성(간단한 개발 경력, 수강 목적, 강좌진행방식 등) - 강좌 수강 - 수강후 : 교육 후 설문 작성 |
| 수강료 | - 580,000원 [고용주환급]대기업:14만원 전후, 중소기업:187,047 원환급 [개인수강지원(개인환급)]정규직 464,000 ,비정규직:전액환급 대기업(상시근로자 300인 이상 대기업)은 개인환급 불가합니다. * 휴강 :법정공휴일 / 추석연휴 휴강 |
| 수강료 입금안내 | - 온/오프라인 카드결제, 계좌이체(수강안내->입금안내 참조) |
| 문의사항 | 02-851-4790 번으로 연락 부탁 드립니다. |
| 교육개요 | 본과정은 자바 웹개발에서 가장 많이 사용되고 있는 자바기반 프레임워크인 Spring3.2를 학습하는데 스프링이 왜 도입되어야 하는지부터, 기본모듈구성, 아키텍처 DI, DL, IoC, 최근 개발모델의 핵심인 Spring AOP, AspectJ Annotation, 표현언어인 SpEL, Spring MVC, Spring MVC TEST Framework, Spring WebFlow, Spring JDBC, Spring Transaction등 개발에 필요한 부분을 체계적으로 실습을 통해 학습하며 SQLMapper인 MyBatis, Hibernate 까지 학습하는 Spring 최고의 교육 입니다. [특징] - 실무/실습에 근거한 이론 취득 - 단기간에 스프링 개발자로 양성 - 문답씩 수업으로 수강 효과 극대화 - 이론/실습 과제로 인한 개발력 UP |
| 교육목표 | - Spring의 도입배경 및 아키텍처에 대해 이해한다. (자바빈의 태동부터 EJB, 그리고 현재까지) - Eclipse, Maven, STS 플러그인에 대한 이해 (개발환경 설정의 이해) - Spring IoC(DI, DL)의 이해 (실습을 통한 setter,getter,constructor injection의 이해) - Spring AOP의 이해 (실습을 통한 Spring AOP의 이해, AOP어렵지 않습니다) - AspectJ Annotation에 대한 이해 (Spring의 AspectJ 지원 및 Annotation 대한 이해 by 실습) - Spring Web MVC, JDBC의 이해 (실습을 통한 Spring MVC, JDBC의 이해) - Spring Controller에 대한 이해 (간단한 Controller의 구현을 통한 MVC Font Contrller의 이해) - Spring Web Flow에 대한 이해 (실습을 통한 Spring Web Flow 및 JSF에 대한 이해) - SpEL에 대한 이해 (실습을 통한 Spring SpEL의 이해) - Servlet3 비동기 요청에 대해 이해한다. (실습을 통한 비동기 서블릿에 대한 이해) - MyBatis Mapper에 대해 이해한다. (실습을 통한 MyBatis 구성, 작동원리 이해) - Hibernate Mapper에 대해 이해한다. (실습을 통한 Hibernate 구성, 작동원리 이해) - 실무 개발 환경에 적응력 UP (Spring, MyBATIS 기반 게시판 작성) |
| 교육대상 | - JAVA, JSP 개발자 - 자바개발은 오래 했지만 프레임워크에 대해 자신이 없는 개발자 - 단기간에 스프링을 박살 내고 싶은 개발자. (스프링 혼자 공부하기는 어렵습니다!!) |
| 선수학습 | - JAVA, JSP |
| Spring3.2 | J2EE Framework에 대한 흐름과 Spring Framework에 대한 이해 개발 환경 설정(Eclipse4.3 KEPLER, Tomcat7, Spring3.2 다운로드 및 설치) Maven, STS 플러그인 설치 Spring IoC DL(Dependency LookUp) &DI(Dependency Injection) Dependency Pull, CDL(Contaxtualized Lookup) Setter/Constructor/Mathod Injection Spring 설정 Spring AOP 란 ?Code, Advice, JoinPoint, PointCut, Aspect, WeavingProxyFactoryBean Annotation기반 AOP(AspectJ) 기타 Spring의 선언적 AOP 선언 Spring JDBC Spring MVC Spring Controller Spring Webflow, JSF Spring 표현언어 SpEL Servlet3 비동기 요청처리 Spring3.2 Transaction 관리 Spring MVC TEST Framework |
|---|---|
| MyBatis/hibernate | [MyBatis] 개요 및 소개 개발환경 설정 및 설치 Data Mapper란 sqlMapConfig 이해 및 환경설정 Spring, MyBatis 연동 SQL Map XML File 이해 SqlMapClient 이해 SQL의 실행(Insert/update/delete) 이해와 실습 고급 쿼리 사용방법의 이해와 실습 Spring MyBatis 응용예제 작성 [Hibernate] Hibernate 소개 SessionFactory 설정 1:1, 1:다 매핑 Session Interface Hibernate DML Spring, Hibernate 예제 프로그램 작성 |
댓글 없음:
댓글 쓰기