• 검색 결과가 없습니다.

스윙은 MVC 모델에 기초를 두고 있다.

N/A
N/A
Protected

Academic year: 2022

Share "스윙은 MVC 모델에 기초를 두고 있다."

Copied!
49
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

프로그래머를

프로그래머를 위한 위한 Java 2, 4 Java 2, 4 판 판

제 제 8 8 장 장 자바 자바 GUI GUI 프로그래밍 프로그래밍 II II

(2)

Chap.8

MVC Model 2

8.1 MVC

8.1 MVC 스윙스윙 모델모델

z

MVC (Model, View, Controller) 모델

†

스윙은 MVC 모델에 기초를 두고 있다.

†

MVC란 Xerox의 연구소에서 Smalltalk 언어를 바탕으로 사용자 인터페이스를 개발하기 위한 방법

†

MVC는 3개의 구성 요소로 구성

 Model : 응용 프로그램의 자료를 표현하기 위한 모델

 View : 자료를 시각적으로 (GUI 방식으로) 표현하는 것

 Controller: 사용자가 View를 통해 입력을 하면 Model을 변경해주는 것

(3)

Chap.8

MVC Model 3

8.1 MVC

8.1 MVC 스윙스윙 모델모델

z

스윙의 MVC 모델

†

모델 , 뷰, 컨트롤러를 분리한 MVC 모델은 상당히 유용하고 강력한 프로그래밍 모델이기 때문에 사용자 인터페이스 개발에 많이 적용

†

스윙을 개발하면서 MVC 모델을 그대로 적용하기에는 실제적인 어려움이 많아서 MVC를 변형한 모델을 개발.

†

스윙에서는 MVC의 뷰와 컨트롤러를 합쳐서 "UI delegate"라는 객체를 정의 .

z

스윙의 MVC

†

모델 – 내부 상태, 자료 관리

†

UI delegate – 모양 결정, 이벤트

(4)

Chap.8

MVC Model 4

MVC MVC 스윙스윙 모델모델

† 스윙의 모든 GUI 컴포넌트들은 UI delegate 부분과 Model 부분으로 구성

† UI delegate 부분은 GUI 컴포넌트의 모양과 사용자의 입력에 따른 이벤트를 처리

† 모델의 역할

 내부 상태를 알아본다.

 내부 상태를 관리한다.

 이벤트 리스너를 추가/삭제 한다.

 이벤트를 발생시킨다.

† UI delegate의 역할

 GUI 컴포넌트를 그려준다.

 GUI 컴포넌트의 위치 정보를 리턴한다.

 AWT 이벤트를 처리한다.

(5)

Chap.8

MVC Model 5

8.1 MVC

8.1 MVC 스윙스윙 모델모델

z

각 컴포넌트의 모델 인터페이스와 모델 타입 (I)

(6)

Chap.8

MVC Model 6

8.1 MVC

8.1 MVC 스윙스윙 모델모델

z

각 컴포넌트의 모델 인터페이스와 모델 타입 (II)

(7)

Chap.8

MVC Model 7

8.1 MVC

8.1 MVC 스윙스윙 모델모델

z

버튼 모델 예

(8)

Chap.8

MVC Model 8

8.1 MVC

8.1 MVC 스윙스윙 모델모델

z

예제 : CountButtonModel.java

4 public class CountButtonModel extends DefaultButtonModel { 5 private int count;

6 private JButton btn;

7

8 public CountButtonModel(JButton btn) { 9 this.btn = btn;

10 btn.setModel(this);

11 }

13 public void setPressed(boolean b) { 14 if(b) {

15 count = ++count % 4;

16 switch(count) { 17 case 0:

18 btn.setBackground(Color.lightGray);

(9)

Chap.8

MVC Model 9

8.1 MVC

8.1 MVC 스윙스윙 모델모델

z

예제 : ButtonModelTest.java

8 ImageIcon rai = new ImageIcon("rai.gif");

9 ok = new JButton("OK", rai);

10 ok.setRolloverIcon(rai);

11 ok.setPressedIcon(rai);

12 CountButtonModel model = new CountButtonModel(ok);

13

14 getContentPane().add("South", ok);

15 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

16 setSize(400, 300);

17 setVisible(true);

(10)

Chap.8

MVC Model 10

8.1 MVC

8.1 MVC 스윙스윙 모델모델

z

새로운 컴포넌트 (ShipComponent) 만들기

(11)

Chap.8

MVC Model 11

8.1 MVC

8.1 MVC 스윙스윙 모델모델

z

예제 : ShipComponent.java

5 public class ShipComponent extends JComponent { 6 private ShipModel model;

7 private ShipComponentUI ui;

8 private ActionListener actionListener;

9 private boolean pressed;

10

11 public ShipComponent(String s, String d) {

12 enableEvents(AWTEvent.MOUSE_EVENT_MASK);

13 model = new DefaultShipModel(s, d);

14 setUI(new ShipComponentUI());

15 }

(12)

Chap.8

MVC Model 12

8.1 MVC

8.1 MVC 스윙스윙 모델모델

z

예제 : ShipComponent.java(계속)

22 public void paint(Graphics g) { 23 ui.paint(this, g);

24 }

35 public void setUI(ShipComponentUI ui) { 36 if(ui != null && this.ui != null) {

37 this.ui.uninstallUI(this);

38 }

40 if(ui != null) { 41 this.ui = ui;

42 this.ui.installUI(this);

43 }

44 updateShipComponent();

(13)

Chap.8

MVC Model 13

8.1 MVC

8.1 MVC 스윙스윙 모델모델

z

예제 : ShipComponent.java(계속)

51 public Dimension getPreferredSize() { 52 return ui.getPreferredSize(this);

53 }

67 public boolean isPressed() { 68 return pressed;

69 } 70

71 public void addActionListener(ActionListener listener) { 72 actionListener =

73 AWTEventMulticaster.add(actionListener, listener);

74 }

(14)

Chap.8

MVC Model 14

8.1 MVC

8.1 MVC 스윙스윙 모델모델

z

예제 : ShipComponent.java(계속)

81 public void processMouseEvent(MouseEvent e) { 82 Graphics g;

83 switch(e.getID()) {

88 case MouseEvent.MOUSE_RELEASED:

89 if(actionListener != null) {

90 actionListener.actionPerformed(new ActionEvent(this, 91 ActionEvent.ACTION_PERFORMED, model.getData()));

92 }

93 if(pressed == true) { 94 pressed = false;

95 repaint();

(15)

Chap.8

MVC Model 15

8.1 MVC

8.1 MVC 스윙스윙 모델모델

z

예제 : ShipComponentUI.java

5 public class ShipComponentUI extends ComponentUI { 6 private Dimension dim;

32 public void paint(ShipComponent ship, Graphics g) {

37 int xs[] = {2, d.width-2, 2*d.width/3, d.width/3, 2};

38 int ys[] = { 2, 2, d.height -2, d.height - 2, 2};

39 Color fg = g.getColor();

40 g.setColor(new Color(200, 200, 200));

41 g.fillPolygon(xs, ys, xs.length);

42 g.setColor(fg);

43 if(ship.isPressed()) {

44 g.drawPolygon(xs, ys, xs.length);

(16)

Chap.8

MVC Model 16

8.1 MVC

8.1 MVC 스윙스윙 모델모델

z

예제 : ImgShipComponentUI.java

3 public class ImgShipComponentUI extends ShipComponentUI { 4 private Image img;

37 public void paint(ShipComponent ship, Graphics g) { 38 Dimension d = ship.getSize();

39 ShipModel model = ship.getModel();

40 ship.setToolTipText(model.getData());

41 if(img != null) {

42 int x = (d.width - img.getWidth(ship))/2;

43 int y = (d.height - img.getHeight(ship))/2;

44 g.drawImage(img, x, y, ship);

45 }

46 if(ship.isPressed()) {

47 g.drawRect(1,1,d.width-2, d.height-2);

(17)

Chap.8

MVC Model 17

8.1 MVC

8.1 MVC 스윙스윙 모델모델

z

예제 : ShipModel.java

1 public interface ShipModel { 2 public String getData();

3 }

(18)

Chap.8

MVC Model 18

8.1 MVC

8.1 MVC 스윙스윙 모델모델

z

예제 : DefaultShipModel.java

1 public class DefaultShipModel implements ShipModel { 2 private String dest;

3 private String start;

4

5 public DefaultShipModel(String s, String d) { 6 start = s;

7 dest = d;

8 } 9

10 public String getData() {

11 return start + " -> " + dest;

(19)

Chap.8

MVC Model 19

8.1 MVC

8.1 MVC 스윙스윙 모델모델

z

예제 : MVCTest.java

4 public class MVCTest extends JFrame implements ActionListener { 6 private ShipComponent toLA, toTokyo;

12 toLA = new ShipComponent("Seoul", "LA");

13 toLA.addActionListener(this);

14 map.add(toLA);

19 toTokyo = new ShipComponent("Seoul", "Tokyo");

20 toTokyo.addActionListener(this);

21 toTokyo.setUI(new ImgShipComponentUI(this, "ship.jpg"));

22 map.add(toTokyo);

23 toTokyo.setLocation(250, 130);

24 toTokyo.setSize(toTokyo.getPreferredSize());

(20)

Chap.8

MVC Model 20

8.1 MVC

8.1 MVC 스윙스윙 모델모델

z

결과

(21)

Chap.8

MVC Model 21

8.2.1

8.2.1 리스트리스트((JListJList))

z

리스트 (JList)

†

여러 개의 값들 중에서 하나 혹은 여러 개를 선택할 수 있는 GUI 컴포넌트

†

형태

z

리스트 사용 예

String [] data = { "ABC", "DEF", "GHI" };

JList list = new JList(data);

JScrollPane pane = new JScrollPane(list);

(22)

Chap.8

MVC Model 22

8.2.1

8.2.1 리스트리스트((JListJList))

z

리스트 모델의 상속 관계

(23)

Chap.8

MVC Model 23

8.2.2

8.2.2 콤보콤보 박스박스((JComboBoxJComboBox))

z

콤보 박스

†

여러 개의 값들 중에서 하나만 선택할 수 있는 GUI 컴포넌트

드랍 다운 메뉴라고도 함

†

형태

z

콤보 박스 사용 예

String[] data = { "ab", "cde" };

JComboBox c = new JComboBox(data);

JComboBox c = new JComboBox();

c.addItem("ab");

c.addItem("cde");

(24)

Chap.8

MVC Model 24

8.2.2

8.2.2 콤보콤보 박스박스((JComboBoxJComboBox))

z

예제 : JListComboBox.java

8 protected String items[] = {"apple", "orange", "banana", "pear"};

13 fruits = new JList(items);

14 fruits.addMouseListener(new MouseAdapter() { 15 public void mouseClicked(MouseEvent e) {

16 int index = fruits.locationToIndex(e.getPoint());

17 if (e.getClickCount() == 1) {

18 System.out.println(items[index]);

19 } else if(e.getClickCount() == 2) {

20 System.out.println("[" + items[index] + "]");

24 fruits.setVisibleRowCount(3);

25 JScrollPane sp = new JScrollPane(fruits);

(25)

Chap.8

MVC Model 25

8.2.2

8.2.2 콤보콤보 박스박스((JComboBoxJComboBox))

z

예제 : JListComboBox.java(계속)

27 colors = new JComboBox();

28 colors.addItem("white");

29 colors.addItem("blue");

30 colors.addItem("green");

31 colors.addItemListener(this);

40 public void itemStateChanged(ItemEvent e) { 41 Object o = e.getSource();

42 if(o == colors) {

43 if(e.getStateChange() == ItemEvent.SELECTED) { 44 Object data = colors.getSelectedItem();

45 System.out.println(data.toString());

(26)

Chap.8

MVC Model 26

8.2.3

8.2.3 셀셀 편집기와편집기와 렌더러렌더러

z

셀 렌더러

†

데이터 값을 화면에 보여주기 위해서 사용되는 클래스

†

리스트 , 콤보 박스, 테이블, 트리에서 사용

†

보통 JLabel로부터 상속받은 클래스 사용

z

셀 편집기

†

셀 데이터 값을 수정할 수 있도록 지원하는 클래스

†

리스트 , 콤보 박스, 테이블, 트리에서 사용

†

보통 JTextField로부터 상속받은 클래스 사용

(27)

Chap.8

MVC Model 27

8.2.3

8.2.3 셀셀 편집기와편집기와 렌더러렌더러

z

셀 렌더러 상속 관계

(28)

Chap.8

MVC Model 28

8.2.3

8.2.3 셀셀 편집기와편집기와 렌더러렌더러

z

예제 : IconCellRenderer.java

5 public class IconCellRenderer extends DefaultListCellRenderer {

12 public Component getListCellRendererComponent(JList list, 13 Object value, int index, boolean isSelected,

14 boolean cellHasFocus) { 15

16 String text = value.toString();

17 setText(text);

18 if(!icons.containsKey(text)) {

19 ImageIcon img = new ImageIcon(text + ".gif");

20 icons.put(text, img);

21 setIcon(img);

22 } else {

23 setIcon((ImageIcon)icons.get(text));

(29)

Chap.8

MVC Model 29

8.2.3

8.2.3 셀셀 편집기와편집기와 렌더러렌더러

z

예제 : DeviceListCombo.java

5 protected JList list;

6 protected JComboBox combo;

7

8 public DeviceListCombo() {

9 super("아이콘을 갖는 리스트와 콤보");

10 String[] data = {"keyboard", "mouse", "joystick" };

11 list = new JList(data);

12 list.setBackground(Color.lightGray);

13 list.setCellRenderer(new IconCellRenderer());

14 getContentPane().add(new JScrollPane(list), "Center");

15

16 combo = new JComboBox(data);

17 combo.setRenderer(new IconCellRenderer());

(30)

Chap.8

MVC Model 30

8.2.4

8.2.4 스피너스피너((JSpinnerJSpinner))

z

스피너

†

마우스 클릭으로 여러 개의 값들 중에서 하나를 선택할 수 있는 GUI 컴포넌트

†

형태

z

스피너 사용 예

SpinnerNumberModel scoreModel = new

SpinnerNumberModel(0,0,100,5);

JSpinner(scoreModel);

(31)

Chap.8

MVC Model 31

8.2.4

8.2.4 스피너스피너((JSpinnerJSpinner))

z

예제 : SpinnerTest.java

10 SpinnerNumberModel scoreModel =

11 new SpinnerNumberModel(0, 0, 100, 5);

12 score = new JSpinner(scoreModel);

16 String colors[] = { "빨강", "노랑", "파랑" };

17 SpinnerListModel colorModel = new SpinnerListModel(colors);

18 color = new JSpinner(colorModel);

22 SpinnerDateModel dateModel = new SpinnerDateModel();

23 date = new JSpinner(dateModel);

(32)

Chap.8

MVC Model 32

8.3 8.3 텍스트텍스트 컴포넌트컴포넌트

z

텍스트 컴포넌트

†

JTextField

한 줄 입력

†

JPasswordField

암호 한 줄 입력

†

JFormattedTextField

포맷이 텍스트의 한 줄 입력

†

JTextArea

여러 줄의 텍스트

(33)

Chap.8

MVC Model 33

8.3 8.3 텍스트텍스트 컴포넌트컴포넌트

z

예제 : SwingText.java

13 public SwingText() throws ParseException {

17 area = new JTextArea();

18 field = new JTextField(10);

19 field.addActionListener(this);

20 passwd = new JPasswordField(10);

21 passwd.addActionListener(this);

22

23 MaskFormatter mf = new MaskFormatter("(0##) ####-####");

24 mf.setPlaceholderCharacter('_');

25 phone = new JFormattedTextField(mf);

26 phone.addActionListener(this);

(34)

Chap.8

MVC Model 34

8.3 8.3 텍스트텍스트 컴포넌트컴포넌트

z

예제 : SwingText.java(계속)

43 public void actionPerformed(ActionEvent e) { 44 Object o = e.getSource();

45 if(o == field || o == passwd || o == phone) { 46 System.out.println("ID - " + field.getText());

47 char [] data = passwd.getPassword();

48 System.out.println("PASSWD - " + new String(data));

49 System.out.println("Phone - " + phone.getValue());

50 } 51 }

(35)

Chap.8

MVC Model 35

8.4.1

8.4.1 탭팬탭팬((JTabbedPaneJTabbedPane))

z

탭팬

†

탭을 이용해서 공간을 효율적으로 사용하기 위한 GUI 컴포넌트

†

형태

z

탭팬 사용 예

JTabbedPane pane = JTabbedPane();

pane.addTab(“One”, icon, panel);

(36)

Chap.8

MVC Model 36

8.4.2

8.4.2 트리트리((JTreeJTree))

z

트리

†

계층적은 데이터를 표현하기 위한 GUI 컴포넌트

†

형태

z

트리 사용 예

JMutableTreeNode root = new JMutableTreeNode("노드");

JMutableTreeNode n1 = new JMutableTreeNode("노드1");

root.add(n1);

JTree tree = new JTree(root);

(37)

Chap.8

MVC Model 37

8.4.2

8.4.2 트리트리((JTreeJTree))

z

예제 : TreeDemo.java

11 DefaultMutableTreeNode jcomponent =

12 new DefaultMutableTreeNode("JComponent");

14 DefaultMutableTreeNode jpanel =

15 new DefaultMutableTreeNode("JPanel");

21 jcomponent.add(jpanel);

33 tree = new JTree(jcomponent);

34 tree.addMouseListener(this);

35 JScrollPane sp = new JScrollPane(tree);

(38)

Chap.8

MVC Model 38

8.4.2

8.4.2 트리트리((JTreeJTree))

z

예제 : TreeDemo.java(계속)

46 public void mousePressed(MouseEvent e) {

47 TreePath path = tree.getPathForLocation(e.getX(), e.getY());

48 if(path == null) 49 return;

50

51 Object o = path.getLastPathComponent();

52 if(o instanceof DefaultMutableTreeNode) {

53 DefaultMutableTreeNode node = (DefaultMutableTreeNode) o;

54 Object uobj = node.getUserObject();

55 System.out.println(uobj);

56 }

(39)

Chap.8

MVC Model 39

8.4.3

8.4.3 테이블테이블((JTableJTable))

z

테이블

†

많은 레코드 데이터를 표현하기 위한 GUI 컴포넌트

†

형태

z

테이블 사용 예

String head[] = { "A", "B" };

String data[][] = { {"a", "b"} };

JTable table = new JTable(data, head);

(40)

Chap.8

MVC Model 40

8.4.3

8.4.3 테이블테이블((JTableJTable))

z

예제 : TableDemo.java

11 String fieldName[] = { 12 "이름",

13 "전화번호",

17 data = new String[3][3];

18 String r0[] = {"최종명", "000-0000", "jmchoi@email"};

19 data[0] = r0;

20 String r1[] = {"박준서", "111-1111", "jspark@email"};

21 data[1] = r1;

25 table = new JTable(data, fieldName);

26 table.addMouseListener(this);

27 JScrollPane sp = new JScrollPane(table);

(41)

Chap.8

MVC Model 41

8.4.3

8.4.3 테이블테이블((JTableJTable))

z

예제 : TableDemo.java(계속)

38 public void mousePressed(MouseEvent e) { 39 int row = table.getSelectedRow();

40 int col = table.getSelectedColumn();

41 if(row == -1 || col == -1) 42 return;

43

44 System.out.print("<" + row + "," + col + "> - ");

45 System.out.println(data[row][col]);

46 }

(42)

Chap.8

MVC Model 42

8.4.5

8.4.5 내부내부 프레임프레임((JInternalFrameJInternalFrame))

z

내부 프레임

†

MDI(Multiple Document Interface) 형태를 지원하기 위한 GUI 컴포넌트

†

형태

z

내부 프레임 사용 예

JInternalFrame f = new JInternalFrame("타이틀", true);

f.setSize(400, 300);

f.setVisible(true);

(43)

Chap.8

MVC Model 43

8.4.5

8.4.5 내부내부 프레임프레임((JInternalFrameJInternalFrame))

z

예제 : InnerFrame.java

11 JDesktopPane desk = new JDesktopPane();

12 iframe = new JInternalFrame("프레임", true, true, true, true);

13 text = new JTextArea();

14 iframe.getContentPane().add(new JScrollPane(text), 15 BorderLayout.CENTER);

16 desk.add(iframe);

17 iframe.setSize(400, 300);

18 iframe.setVisible(true);

19 getContentPane().add(desk, BorderLayout.CENTER);

(44)

Chap.8

MVC Model 44

8.5 8.5 자바자바 룩룩--앤앤--필필

z

룩 -앤-필

†

스윙 GUI 형태를 동적으로 변경할 수 있는 방법을 제공

†

기본으로 제공되는 룩 -앤-필

자바

모티프

윈도우

기타 – JDK 버전에 따라 약간씩 다름

†

필요한 경우에 개발자가 새로운 룩 -앤-필을 개발할 수 있음

(45)

Chap.8

MVC Model 45

8.5 8.5 자바자바 룩룩--앤앤--필필

z

예제 : LookNFeelTest.java

65 if(o == metal) { 66 try {

67 UIManager.setLookAndFeel(

68 "javax.swing.plaf.metal.MetalLookAndFeel" );

69 SwingUtilities.updateComponentTreeUI(this);

70 } catch(Exception ex1) { 71 ex1.printStackTrace();

72 }

73 } else if(o == motif) { 74 try {

75 UIManager.setLookAndFeel(

76 "com.sun.java.swing.plaf.motif.MotifLookAndFeel" );

77 SwingUtilities.updateComponentTreeUI(this);

(46)

Chap.8

MVC Model 46

8.6 8.6 드래그드래그--앤앤--드랍드랍

z

드래그 -앤-드랍(Drag & Drop)

†

자바 프로그램간 혹은 일반 프로그램과 자바 프로그램간의 드래그 -앤- 드랍을 지원

†

용어 및 지원되는 클래스들

드래그 소스(DragSource) : 드래그-앤-드랍이 시작되는 GUI 컴포넌트

드래그 타겟(DropTarget) : 드래그-앤-드랍이 끝나는 GUI 컴포넌트

Transferable : 드래그-앤-드랍을 통해서 전달되는 데이터

DataFlavor : 드래그-앤-드랍을 통해서 전달되는 데이터 포맷

DnDConstants : 드래그-앤-드랍의 동작 방식

(47)

Chap.8

MVC Model 47

8.6 8.6 드래그드래그--앤앤--드랍드랍

z

예제 : DnDText.java

2 import java.awt.dnd.*;

3 import java.awt.datatransfer.*;

6 public class DnDText extends JFrame implements DropTargetListener {

12 editor = new JTextArea();

13 target = new DropTarget(editor,

14 DnDConstants.ACTION_COPY_OR_MOVE, this, true, null);

21 public void dragEnter(DropTargetDragEvent dtde) { 22 System.out.println("dragEnter");

23 }

(48)

Chap.8

MVC Model 48

8.6 8.6 드래그드래그--앤앤--드랍드랍

z

예제 : DnDText.java(예제)

33 public void drop(DropTargetDropEvent dtde) { 35 if((dtde.getDropAction() &

36 DnDConstants.ACTION_COPY_OR_MOVE) != 0) { 37 dtde.acceptDrop(dtde.getDropAction());

38 Transferable tr = dtde.getTransferable();

39 try {

40 java.util.List list = (java.util.List)

41 tr.getTransferData(DataFlavor.javaFileListFlavor);

42 File file = (File)list.get(0);

43 char buf[] = new char[1024];

44 BufferedReader in =

45 new BufferedReader(new FileReader(file));

48 while((n = in.read(buf, 0, 1024)) != -1) { 49 editor.append(new String(buf, 0, n));

(49)

Chap.8

MVC Model 49

8.6 8.6 드래그드래그--앤앤--드랍드랍

z

결과

참조

관련 문서

본회 회장은 회원수 및 지리적 조건 등을 참작하여 필요하 다고 인정할 때에는 인접시도, 시·군·구를 통합하여 하나의 지부나 지회를 둘 수 있다.... 직할회는 본회

• 경영학의 고전적 접근이론에 기초를 둔 것으로 조직의 모든 상황 에 적합한 단일 조직구조를 개발하기 위한 원칙을 추구하는 접근 방법.. • 가정

정신기능의 기초를 이루는 심리학적, 생물학적, 혹은 발달 과정에서의 기능 이상 을 반영하며, 개인의 인지, 정서 조절 또는 행동에서 임상적으로 유의한

극한, 연속성, 미분가능성의 이론은 그 이전에 가정되었던 실수 체계의 성질보 다 더욱 심오한 성질에 근거하고 있다는 사실이 분명해졌으며, 코시가 해석학에 대한

Programming Language, Standard ECMA-262 3rd Edition - December 1999의 일부에 토대를 두고 있다. 이러한 속성들이 JSON을 이상적인 DATA-교환 언 어로 만들고

멜란히톤은 루터의 종교개혁을 평생 동안 도왔으며 종교개혁 사상의 이론적 기초를 제공했던 자였다... 1535년 루터파교회에서

총 20차시로 만들어진 이 프로그램은 디자인씽킹 프로세스를 활용하여 실생활의 문제를 학생 스스로 파악하고 직접 해결해나가는데 중점을 두고 있다.. 본 프로그램을

STEAM 교사 연구회 중심으로 교내 수업장터를 개최하여 교과 간 융합수업을 위한 기초를 형성하고자 노력하였으며, STEAM 프로젝트 학습 주간(흥부몰부전)을