티스토리 뷰

학습정리-12-10.txt
0.00MB

1.아래의 용어에 대하여 설명하시오.

-DI

(Dependency Injection  의존성 주입)

객체를 직접 생성하는 게 아니라 외부에서 생성한 후 주입 시켜주는 방식이다.

 

 

-IOC

(Inversion of Control  제어의 역전)

메소드나 객체의 호출작업을 다이렉트로 직접하는 것이 아니라, 외부에서 가져와 사용하는 것을 말한다.

다이렉트로 객체를 생성해 줄 경우와 객체 호출 순서가 반대로 되기 때문에 제어의 역전이라고 부른다.

이 경우 쉽게 다양한 객체를 생성, 수정이 가능해진다.

자세한 내용은 아래 예시 참고!

 

 

-IOC 컨테이너

DI를 주입해 IOC들을 관리해 주는 프레임워크가 바로 IOC 컨테이너, 즉 Spring이다.

 

 

- [로드 존슨]

이 스프링을 만들 때 위의 세 가지 개념으로 만들었다고 했기 때문에 중요하고 반드시 알아야한다.

이 세 가지 개념은 스프링에서 생겨난 것은 아니고 원래 있던 유명한 개념이다.

(이 개념들은 현실에 있는걸 표현하기 위해서 추상화 시킨 것)

- 결국 스프링이란 부품을 생성하고 조립하는 라이브러리의 집합체라고 할 수 있다.

- 스프링 이전에는 EJB로 어렵게 작업을 했다.

 


IOC 수업 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
DI(의존성 주입)
 
객체 넣는 방법
1. 다이렉트로 new
2. getter. setter 함수 사용
다이렉트로 생성하지 않고 생성자나 setter 함수를 이용해서 어딘가에서 받아오는 것...(의존성 주입)
- 다른 객체애서 넣어준다...
->  가장 좋은 방법!!
클래스 안의 데이터 멤버는 무조건 getter, setter를 사용해 주기.
 
class Person{
    Heart heart = null; 이면 사람 죽어...
    따라서 person클래서는 heart에 의존하고 있다..
    이것이 의존성 주입
    해당 클레스 안에 있는 데이터 멤버에 해당 클래스가 의존하고 있는 것이 의존성 주입!
    
    Person(Heart heart){
        this.heart = heart;
    }
    
    void setHeart(Heart heart) {
        this.heart = heart;
    }
    
}
 
IOC(inversion of control - 제어의 역전)
- 객체 호출 순서
 
class Computer{
    Cpu cpu; - cpu에 의존
    
    1. 다이렉트
    Cpu cpu = new Cpu();
    
    2. 생성자
    Computer(Cpu cpu){
        this.cpu = cpu;
    }
        
}
 
class Cpu{
    Chip chip; - cpu는 내부적으로 회로(칩)이 있어야 된다.(chip에 의존)
    
    1. 다이렉트
    Chip chip = new chip();
    
    2. 생성자
    Cpu(Chip chip){
        this.chip = chip;
    }
}
 
public class MainClass {
 
    public static void main(String[] args) {
        1.
        Computer com = new Computer();
        
        다이렉트로 new 했을 경우 객체 호출 순서
        Computer -> Cpu -> Chip
        
        
        2.
        Chip chip = new Chip();
        Cpu cpu = new Cpu(chip);
        가 먼저 생성이 되어 있어야
        Computer 객체를 생성할 수 있다..
        Computer com = new Computer(cpu);
        
        생성자의 경우 객체 호출 순서
        Chip -> Cpu -> Computer
        1번과 다르게 거꾸로이다..그래서 제어의 역전이라고 부른다.(IOC)
        
    }
    
    ==> 결국 왜 다이렉트로 넣는 것보다 IOC가 좋은 이유는?
        다이렉트로 넣게 되면 처음부터 데이터형이 결정돼서 완성되어 버린다...
        이 후에 변경하는 것이 불가..완성품...새로 객체를 또 생성해야한다.
        getter, setter, 생성자를 이용할 경우 원하는 데이터 형으로 만들 수 있다..(폴리몰티즘?)
        조립품....부품(넣는 값)을 원하는대로 변경 가능...(getter, setter)
 
        이 IOC를 관리하는 컨테이너가 Spring    !    
}
cs

spring을 사용하려면 우선

pom.xml에서 아래에 해당하는 spring 코드 부분이 있어야한다. (spring 해당 코드 부분이 보이는 곳 까지만 발췌)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.springframework.samples</groupId>
  <artifactId>spring_2_2_ex1_springex</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <properties>
 
        <!-- Generic properties -->
        <java.version>1.6</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 
        <!-- Spring -->
        <spring-framework.version>3.2.3.RELEASE</spring-framework.version>
 
        <!-- Hibernate / JPA -->
        <hibernate.version>4.2.1.Final</hibernate.version>
 
        <!-- Logging -->
        <logback.version>1.0.13</logback.version>
        <slf4j.version>1.7.5</slf4j.version>
 
        <!-- Test -->
        <junit.version>4.11</junit.version>
 
    </properties>
    
    <dependencies>
        <!-- Spring and Transactions -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>
cs

그리고 Maven Dependencies 폴더 안에 spring .jar파일들이 있어야한다.

 

 

2..삼각형및 사각형의 넓이를 구하는 프로그래밍을 IoC 컨테이너를 이용하여 프로그래밍 하시오.

- 삼각형과 사각형 Class 만들기

Triangle.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package edu.kosmo.ex.shape;
 
public class Triangle {
    private int width;
    private int height;
    
    public Triangle() {
 
    }
 
    public Triangle(int width, int height) {
        this.width = width;
        this.height = height;
    }
 
    public int getWidth() {
        return width;
    }
 
    public void setWidth(int width) {
        this.width = width;
    }
 
    public int getHeight() {
        return height;
    }
 
    public void setHeight(int height) {
        this.height = height;
    }
    
    public double TriangleArea() {
        return (width * height) / 2;
    }
    
}
cs

 

 

Rectangle.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package edu.kosmo.ex.shape;
 
public class Rectangle {
    private int width;
    private int height;
    
    public Rectangle() {
 
    }
 
    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }
 
    public int getWidth() {
        return width;
    }
 
    public void setWidth(int width) {
        this.width = width;
    }
 
    public int getHeight() {
        return height;
    }
 
    public void setHeight(int height) {
        this.height = height;
    }
    
    public int RecArea() {
        return width * height;
    }
    
}
 
cs

 

- appCTX.xml 에서 사각형과 삼각형 객체 생성및 가로세로 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <!-- Triangle 객체 -->
    <!-- new로 객체 생성해주는 부분-->    
    <bean id="triangle" class="edu.kosmo.ex.shape.Triangle"> 
        <!--setter함수를 이용해 값 -->
        <property name="width" value="20"/>
        <property name="height" value="30"/>    
    </bean>
    
    <!-- Rectangle 객체 -->    
    <bean id="rectangle" class="edu.kosmo.ex.shape.Rectangle">
        <property name="width" value="20"/>
        <property name="height" value="30"/>    
    </bean>
</beans>    
 
cs

 

 

- main 클래스에서 Ioc 컨테이너 생성후 삼각형 사각형 객체를 받아 온후, 넓이 함수 호출

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package edu.kosmo.ex.shape;
 
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
 
 
public class MainClass {
 
    public static void main(String[] args) {
                
        String config = "classpath:appCTX.xml";
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(config);
                                            // 이게 스프링...IOC 컨테이너
                                            // 객체를 .xml로 이렇게 관리한다.
        
                                // 어딘가에서 new한 객체를 가져와야한다...
                                // 그 역할을 하는 것이 getBean("triangle", Triangle.class)
                                // Triangle.class에 해당되는 곳 찾아가서 확인하고 가져옴
        Triangle triangle = ctx.getBean("triangle", Triangle.class);
        System.out.println("삼각형 넓이: " + triangle.TriangleArea());
        
        Rectangle rectangle = ctx.getBean("rectangle", Rectangle.class);
        System.out.println("사각형 넓이: " + rectangle.RecArea());
    }
    
}
 
cs

 

 

3.아래의 SQL를 푸시오

--35> 관리자 번호 및 해당 관리자에 속한 사원들의 최저 급여를 출력하라.

단, 관리자가 없는 사원 및 최저 급여가 1000 미만인 그룹은 제외시키고 급여를 기준으로

출력 결과를 내림차순으로 정렬하라.

--36> 부서별로 부서이름, 부서위치, 사원 수 및 평균 급여를 출력하라.

그리고 각각의 컬럼명을 부서명,위치,사원의 수,평균급여로 표시하라.

--37> Smith와 동일한 부서에 속한 모든 사원의 이름 및 입사일을 출력하라.

단, Smith는 제외하고 출력하시오

--38> 자신의 급여가 평균 급여보다 많은 모든 사원의 사원 번호, 이름, 급여를

표시하는 질의를 작성하고 급여를 기준으로 결과를 내림차순으로 정렬하라.

--39> 이름에 T가 들어가는 사원의 속한 부서에서 근무하는 모든 사원의

사원번호 및 이름을 출력하라.

--40> 부서위치가 Dallas인 모든 사원의 이름,부서번호 및 직위를 출력하라.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
-- 35> 관리자 번호 및 해당 관리자에 속한 사원들의 최저 급여를 출력하라.
-- 단, 관리자가 없는 사원 및 최저 급여가 1000 미만인 그룹은 제외시키고 급여를 기준으로
-- 출력 결과를 내림차순으로 정렬하라.
SELECT mgr, MIN(sal) FROM emp GROUP BY mgr 
HAVING MIN(sal) > 1000 and mgr IS NOT NULL ORDER BY MIN(sal) DESC;
 
-- 36> 부서별로 부서이름, 부서위치, 사원 수 및 평균 급여를 출력하라.
-- 그리고 각각의 컬럼명을 부서명,위치,사원의 수,평균급여로 표시하라.
SELECT d.dname AS "부서명", d.loc AS "위치"COUNT(e.empno) AS "사원의 수"AVG(e.sal) AS "평균급여" 
FROM emp e, dept d WHERE e.deptno=d.deptno GROUP BY d.deptno, d.dname, d.loc;
 
-- 37> Smith와 동일한 부서에 속한 모든 사원의 이름 및 입사일을 출력하라.
-- 단, Smith는 제외하고 출력하시오
SELECT ename, hiredate FROM emp 
WHERE deptno=(SELECT deptno FROM emp WHERE ename='SMITH')
AND ename != 'SMITH';
 
-- 38> 자신의 급여가 평균 급여보다 많은 모든 사원의 사원 번호, 이름, 급여를
-- 표시하는 질의를 작성하고 급여를 기준으로 결과를 내림차순으로 정렬하라.
SELECT empno, ename, sal FROM emp 
WHERE sal > (SELECT AVG(sal) FROM emp) 
ORDER BY sal DESC;
 
-- 39> 이름에 T가 들어가는 사원의 속한 부서에서 근무하는 모든 사원의
-- 사원번호 및 이름을 출력하라.
SELECT empno, ename FROM emp WHERE deptno IN(SELECT deptno FROM emp WHERE ename LIKE '%T%');
 
--40> 부서위치가 Dallas인 모든 사원의 이름,부서번호 및 직위를 출력하라.
SELECT ename, job FROM emp, dept 
WHERE emp.deptno=dept.deptno AND dept.loc='DALLAS'
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-- Smith보다 늦게 입사한 사원의 이름 및 입사일을 출력하라.
SELECT ename, hiredate FROM emp WHERE hiredate > 
(SELECT hiredate FROM emp WHERE ename='SMITH');
 
-- 자신의 관리자보다 먼저 입사한 모든 사원의 이름, 입사일,
-- 관리자의 이름, 관리자의 입사일을 출력하되 각각 컬럼명을
-- Employee,EmpHiredate, Manager,MgrHiredate로 표시하여 출력하라.
SELECT e.ename as "Employee", e.hiredate as "EmpHiaredate", m.ename as "Manager", m.hiredate AS "MgrHiredate" 
FROM emp e, emp m WHERE e.mgr = m.empno AND e.hiredate < m.hiredate;
 
-- 모든 사원의 급여 최고액,최저액,총액 및 평균액을 출력하되
-- 각 컬럼명을 Maximum, Minimum, Sum, Average로 지정하여 출력하라.
SELECT MAX(sal) "Maximum"MIN(sal) "Minimun" , SUM(sal) "Sum"AVG(sal) "Average" FROM emp; 
 
-- 각 직업별로 급여 최저액.최고액,총액 및 평균액을 출력하라.
SELECT job, MAX(sal), MIN(sal) , SUM(sal), AVG(sal) FROM emp GROUP BY job;
-- ~별 나오면 group by 사용하기
 
-- 직업이 동일한 사람 수를 직업과 같이 출력하라.
SELECT COUNT(job), job FROM emp GROUP BY job;
cs

개별진척도

52번)

아래와 같이 출력이 나오도록 프로그래밍을 하시오.

 

HashSet<Num> set = new HashSet<>();

set.add(new Num(7799));

set.add(new Num(9955));

set.add(new Num(7799));

 

System.out.println("인스턴스 수: " + set.size());

 

for(Num n : set)

System.out.print(n.toString() + '\t');

 

System.out.println();

 

/*

====출력

인스턴스 수: 2

7799 9955

*/

 

53번

 

HashMap<Integer, String> map = new HashMap<>();

map.put(45, "Brown");

map.put(37, "James");

map.put(23, "Martin");

 

위의 Value 값이 다나오도록 for 문 돌리시오.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함