728x90
반응형
SMALL

---------학교에서 배운 내용(개인적으로 공부한 내용), 여기서부터 이해가 필요한거 같아서 정리해서 올립니다---------

---------아직 실력이 부족해서 예제는 다 못풀어서 일단 풀 수 있는 문제만 풀었습니다.---------

 

<<<<<<<<<<<<<<JAVA의 기본적인 스윙컴포넌트와 활용>>>>>>>>>>>>>>>>>>>>>

 

GUI 프로그래밍

- 컴포넌트 기반 : 스윙 패키지에 주어진 GUI 컴포넌트 이용하며 구성이 쉽다. 일반적인 GUI 프로그램에 적합하며 자바 패키지에 제공하는 GUI 컴포넌트 한계가 있다.

- 그래픽 기반 (명품자바 12장) : 선, 원, 도형, 이미지를 직접 그리는 그래픽 화면 구성. 개발자의 작업 부담이 높으며 자바 패키지에 없는 독특한 GUI 구성 가능. 게임 등 자유로운 GUI

 

<<스윙 컴포넌트와 상속 관계>>

스윙 컴포넌트 의 공통 메소드, JComponent는 컴포넌트의 모양, 상태, 위치, 크기에 관련된 메소드와 컨테이너를 위한 메소드가 있다.

 

JLabel : 문자열이나 이미지를 컴포넌트화해 출력해줌

JButton 과 JLabel 은 윈도우의 컴포넌트이다.

JButton : 이름 그대로 버튼으로, 레이블처럼 JFrame에 붙여서 사용

JCheckBox : 선택, 비선택 두 가지 상태를 가지는 버튼

JRadioButton : 사용자가 여러 개의 선택지 중에 1개의 선택지만 선택할 수 있는 버튼

 

- 라디오버튼 : 하나만 선택. 반드시 논리적 버튼그룹 객체가 필요하다.

라디오 버튼은 하나를 선택하면 기존에 선택된 버튼이 선택 해제가 되기 때문에, 사용자가 잘못된 여러 개의 옵션을 선택하지 못하도록 방지해주는 역할을 한다.
라디오 버튼은 옵션이 숨겨져 있는 드롭다운 메뉴과 달리 옵션들이 밖으로 나와있기 때문에, 사용자가 불필요한 테스크를 수행하지 않도록 도와줄 수 있다.

 

- 체크박스 : 다중 선택

체크 박스(check box)는 컴퓨팅에서 그래픽 사용자 인터페이스 요소 위젯의 하나이다. 사용자가 수많은 선택 사항에서 여러 개를 선택할 수 있게 한다.

 

JSlider : 마우스로 움직이면서 값을 선택하는 컴포넌트

JTextField : 한줄의 문자열을 입력받는 창
    - 텍스트 입력 도중 <ENTER> 키가 입력되면 Action 이벤트 발생
    - 입력 가능한 문자 개수와 입력 창의 크기는 서로 다름

JTextArea :여러 줄의 문자열을 입력받을 수 있는 창
    - 스크롤바를 지원하지 않는다.
    - JScrollPane 객체를 삽입하여 스크롤바 지원

JList<E> : AWT의 List와 비슷한 기능을 제공,

    - JList클래스는 모델 클래스를 직접 설계하지 않더라도 기본적으로 DefaultListModel를 제공하므로 리스트 객체를          생성한다.

JComboBox<E> : 여러항목을 보여주고, 선택을 하도록 한다는 점에서는 JList와 같다

    - 처음에는 기본항목만 보이고 클릭하면 여러항목이 나타난다.

    - ItemSelectable은 항목선택이 가능하도록 해주는 인터페이스

    - ListDataListenner는 기본항목을 선택된 항목으로 바꿀 때 필요하다.

    - Accessible은 위젯의 위치로 작동에 관한 인터페이스.

 

생성자함수

JComboBox() - 기본생성자

JComboBox()(Object[] items) - 특정 배열을 항목으로 하는 콤보박스 생성

JComboBox()(Vector<?>items) - 특정 벡터를 항목으로 하는 콤보박스 생성

 

메소드

void addItem(Object o) - 아이템 항목을 추가할 때 사용

void removeltem(Object o) - 아이템 항목을 제거할 때 사용

void removeAllItems() - 모든 항목을 제거할 때 사용

void serEditable(boolean b) - 편집기능 여부

void actionListener(ActionListener a) - 액션 리스너 붙이기

void addItemListener(ItemListener i) - 아이템 리스너 붙이기

E getItemAt(int index) - 특정 인덱스에 있는 아이템 항목 반환,

int getSeleCtedindex() - 선택 항목의 인텍스를 반환

메뉴 만드는 과정 : JMenuBar->JMenu컴포넌트->JMenuItem->JMenuBar컴포넌트를 JFrame 에 붙인다.

팝업 다이얼로그 : JAVA스윙에서 이미 구현해놓은 간단한 팝업창으로 사용자에게 메시지를 전달하거나 간단한 문자열을 입력받을 수 있는 유용한 다이얼로그

입력 다이얼로그 : 사용자에게 보여주고자 하는 내용을 출력하고 사용자로부터 입력을 받는 대화상자이다. -다른컨테이너에 속할 필요없이 화면에 출력가능

 

예제 11-4.  문자열 체크박스 2개와 이미지 체크박스 1개를 가진 프로그램을 작성하라. 이미지 체크박스에는 선택 상태를 나타내는 이미지를 지정하여야 한다.

package test11;

import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class CheckBoxTest extends JFrame{
	CheckBoxTest(){
		setTitle("CheckBox");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		JPanel p=new JPanel();
		ImageIcon checked=new ImageIcon("images/rpgiab_icon_pack/32x32/star.png");
		ImageIcon nonchecked=new ImageIcon("images/rpgiab_icon_pack/32x32/wizard.png");
			
		JCheckBox apple=new JCheckBox("머글");
		JCheckBox pear=new JCheckBox("마법사", true);
		JCheckBox cherry=new JCheckBox("뾰로롱", nonchecked);
		cherry.setBorderPainted(true);
		cherry.setSelectedIcon(checked);  //선택이 되었을 때
		
		p.add(apple); p.add(pear); p.add(cherry);
		add(p);
		setVisible(true);
	}
	public static void main(String[] args) {
		new CheckBoxTest();
	}
}

 

예제 11-5.  다음 그림과 같이 세 과일에 대해 각각 체크박스를 만들고, 사용자가 과일을 선택하거나 해제하면 바로 선택된 과일의 합산을 보여주는 응용프로그램을 작성하라.

package test11;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class ItemEventTest extends JFrame {
	private JCheckBox[] fruits;
	private String[] names = { "사과", "배", "체리" };
	private JLabel sumLa;

	ItemEventTest() {
		setTitle("11-5");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		JPanel p = new JPanel();    //안묶어주면 오류가 많다.

		fruits = new JCheckBox[3];
		MyItemListener l = new MyItemListener();
		for (int i = 0; i < fruits.length; i++) {
			fruits[i] = new JCheckBox(names[i]);
			fruits[i].addItemListener(l);
			p.add(fruits[i]);

		}
		sumLa = new JLabel("현재 금액은 0원입니다");
		c.add(new JLabel("사과 100원 배 500원 체리 20000원"));
		c.add(p);
		c.add(sumLa);
		setVisible(true);

	}

	public static void main(String[] args) {
		new ItemEventTest();

	}

	class MyItemListener implements ItemListener{
		private int sum=0;

		@Override
		public void itemStateChanged(ItemEvent e) {
			if(e.getStateChange()==ItemEvent.SELECTED) 
			{
				if(e.getItem()==fruits[0]) 
				{
					sum+=100;
				}else if(e.getItem()==fruits[1]) {
					sum+=500;
				}else {
					sum+=20000;
				}
			}	
			else    // 버튼을 뺄 때
			{	
				if(e.getItem()==fruits[0]) 
				{
					sum-=100;
				}
				else if(e.getItem()==fruits[1])
				{
					sum-=500;
				}
				else 
				{ 
					sum-=20000;
				}
		}
		sumLa.setText("현재 금액은 "+sum+"입니다");
		}
	}
}

 

예제 11-7. 3개의 라디오버튼을 생성하고 각 라디오버튼이 선택될 때 해당 이미지를 출력하는 응용프로그램을 작성하라. 3개의 라디오버튼을 만들고 동일한 버튼 그룹에 삽입, 그중 한 라디오버튼을 초기에 선택 상태로 만든다. JPanel 객체를 하나 생성하고 그 곳에 3개의 라디오버튼을 붙이고, JPanel 객체를 컨텐트팬의 NORTH에 배치한다. 이미지는 JLabel을 통해 출력하며 컨텐트팬의 CENTER에 배치한다.

package test11;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

public class RadioButtonEx extends JFrame {
	JRadioButton[] rb = new JRadioButton[3];
	ImageIcon[] icon = { new ImageIcon("images/rpgiab_icon_pack/32x32/star.png"),
			new ImageIcon("images/rpgiab_icon_pack/32x32/puzzle.png"),
			new ImageIcon("images/rpgiab_icon_pack/32x32/palette.png") };
	String[] str = { "별", "퍼즐", "빠레뜨" };
	JLabel imgLa;

	RadioButtonEx() {
		setTitle("예제");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		JPanel p = new JPanel();
		p.setBackground(Color.GRAY);
		
		ButtonGroup g = new ButtonGroup();
		MyItemListener l = new MyItemListener();
		imgLa = new JLabel(icon[0]);
		
		for (int i = 0; i < rb.length; i++) {
			rb[i] = new JRadioButton(str[i]);
			rb[i].addItemListener(l);
			g.add(rb[i]);
			p.add(rb[i]);
		}
		rb[0].setSelected(true);
	
		add(p, BorderLayout.NORTH);
		add(imgLa);

		setVisible(true);
		
	}

	public static void main(String[] args) {
		new RadioButtonEx();
	}

	class MyItemListener implements ItemListener {

		@Override
		public void itemStateChanged(ItemEvent e) {
			// TODO Auto-generated method stub
			if (e.getStateChange() == ItemEvent.DESELECTED) // 미선택
				return;
			if (rb[0].isSelected()) {
				imgLa.setIcon(icon[0]);
			} else if (rb[1].isSelected()) {
				imgLa.setIcon(icon[1]);
			} else {
				imgLa.setIcon(icon[2]);
			}
		}
	}
	class MyActionListener implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			String str=e.getActionCommand();
			if(str.equals("추가")) {	
			}else if(str.equals("취소")){
			}	
		}
	}
}

 

예제 11-8. JTextField를 이용하여 그림과 같이 이름, 학과, 주소를 입력받는 폼을 만들어라. 입력 창의 열의 개수는 모두 20으로 한다.

 

 

package test11;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class ComboTest extends JFrame{
	String[] str= {"1번마", "2번마", "3번마"};
	ImageIcon[] imgs= {
			new ImageIcon("images/rpgiab_icon_pack/32x32/star.png"),
			new ImageIcon("images/rpgiab_icon_pack/32x32/light.png"),
			new ImageIcon("images/rpgiab_icon_pack/32x32/weather_sun.png")};
	
	JLabel la=new JLabel();

	ComboTest(){
		setTitle("ComboTest");
		setSize(300, 100);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		JComboBox<String> combo=new JComboBox<String>(str);
		Container c=getContentPane();
		c.setLayout(new FlowLayout());
		
		la.setIcon(imgs[0]);
		c.add(combo);
		c.add(la);
		
		setVisible(true);
		combo.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				int index=combo.getSelectedIndex();
				la.setIcon(imgs[index]);
			}
		});
	}

	public static void main(String[] args) {
		new ComboTest();
	}
}

 

예제 11-15. 다음 그림과 같이 JSlider를 이용하여 3개의 슬라이더를 만들고, 각 슬라이더는 색의 구성 요소인 r(red), g(green), b(blue) 값을 선택하는데 사용하라. 사용자가 선택한 r,g,b 값을 조합하여 레이블의 배경색으로 출력하라.

package test0507;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
	
public class SliderTest extends JFrame{
	private JLabel colorLabel;
	private JSlider[] sl=new JSlider[3];

	SliderTest(){
		setTitle("11-15");
		setSize(300, 250);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c=getContentPane();
		c.setLayout(new FlowLayout());
		
		colorLabel=new JLabel("슬라이드 테스트");
		colorLabel.setOpaque(true);
		
		for(int i=0; i<sl.length; i++) {
			sl[i]=new JSlider(JSlider.HORIZONTAL, 0, 255, 128);
			sl[i].setPaintLabels(true);   //숫자라벨
			sl[i].setPaintTicks(true);   //눈금
			sl[i].setPaintTrack(true);    // ?
			sl[i].setMajorTickSpacing(50);
			sl[i].setMinorTickSpacing(10);
			sl[i].addChangeListener(new MyChangeListener());
			c.add(sl[i]);
		}
		c.add(colorLabel);
		
		sl[0].setForeground(Color.RED);
		sl[1].setForeground(Color.GREEN);
		sl[2].setForeground(Color.BLUE);
		
		int r=sl[0].getValue();
		int g=sl[1].getValue();
		int b=sl[2].getValue();
		
		colorLabel.setBackground(new Color(r,g,b));
		
		setVisible(true);
	}

	public static void main(String[] args) {
		new SliderTest();

	}
	class MyChangeListener implements ChangeListener{

		@Override
		public void stateChanged(ChangeEvent e) {
			int r=sl[0].getValue();
			int g=sl[1].getValue();
			int b=sl[2].getValue();
			colorLabel.setBackground(new Color(r,g,b));
			
		}
		
	}

}

 

예제 11-16. 메뉴를 만들어보자. 그림과 같이 Screen, Edit, Source, Project, Screen, Edit, Source, Project, Run Run의 5개 메뉴를 가지며 Screen 메뉴에만 4개의 메뉴아이템과 분리선 (separator) 을 가지도록 프로그램을 작성하라 .

package test0507;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class MenuTest01 extends JFrame{
	MenuTest01(){
		setTitle("이벤트처리");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		JMenuBar mb=new JMenuBar();
		JMenu screenMenu=new JMenu("Screen");
		mb.add(screenMenu);
	
		screenMenu.add(new JMenuItem("Load"));
		screenMenu.add(new JMenuItem("Hide"));
		screenMenu.add(new JMenuItem("ReShow"));
		screenMenu.addSeparator(); //구분선
		screenMenu.add(new JMenuItem("Exit"));
		
		setJMenuBar(mb);
		
		setVisible(true);
	}

	public static void main(String[] args) {
		new MenuTest01();
	}
}

 

예제 11-17. 메뉴에 액션 이벤트 달기

package test0507;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class MenuTest01 extends JFrame{
	JLabel imgLa;
	String[] menuStr= {"Load", "Hide", "ReShow", "Exit"};
	JMenuItem[] menuItem=new JMenuItem[4];
	
	MenuTest01(){
		setTitle("이벤트처리");
		setSize(400, 400);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		JMenuBar mb=new JMenuBar();
		JMenu screenMenu=new JMenu("Screen");
		mb.add(screenMenu);
		imgLa=new JLabel();
		imgLa.setOpaque(true);
		imgLa.setBackground(Color.GRAY);
		
		
		for(int i=0; i<menuItem.length; i++) {
			menuItem[i]=new JMenuItem(menuStr[i]);
			menuItem[i].addActionListener(new MenuActionListener());
			screenMenu.add(menuItem[i]);
			if(i==2) screenMenu.addSeparator();
		}
	
		setJMenuBar(mb);
		add(imgLa);
		setVisible(true);
	}

	public static void main(String[] args) {
		new MenuTest01();

	}
	//event
	class MenuActionListener implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			String cmd=e.getActionCommand();   //스트림에 따라 명령
			switch(cmd) {
				case "Load":
					if(imgLa.getIcon()!=null)
						return;
						imgLa.setIcon(new ImageIcon("images/aa.jpg"));
						break;
				case "Hide":
					imgLa.setVisible(false);
					break;
				case "Reshow":
					imgLa.setVisible(true);
					break;
				case "Exit":
					System.exit(0);   
					break;
			}
		}	
	}
}

 

728x90
반응형
LIST

'명품자바프로그래밍' 카테고리의 다른 글

명품 JAVA programming 10장  (0) 2021.09.29
명품 JAVA programming 9장  (0) 2021.09.29
명품 JAVA programming 7장  (0) 2021.09.28
명품 JAVA programming 6장  (0) 2021.09.28
명품 JAVA programming 5장  (0) 2021.09.28
728x90
반응형
SMALL

---------학교에서 배운 내용(개인적으로 공부한 내용), 여기서부터 이해가 필요한거 같아서 정리해서 올립니다---------

 

<<<<<<<<<<<<<<JAVA의 이벤트 처리>>>>>>>>>>>>>>>>>>>>>

 

 

이벤트(event) : 어떤 동작(마우스로 버튼을 클릭하는 것 등)에 의하여 발생한다. 이벤트가 발생하면 해당 컴포넌트가 이벤트 객체를 생성한다.

이벤트 객체(event object) : 이벤트에 대한 여러가지 정보를 가지고 있다.

이벤트 소스(event source) : 이벤트를 발생시킨 컴포넌트를 부르는 말이다.

이벤트 리스너(event listen) : 발생된 이벤트 객체에 반응하여서 이벤트를 처리한는 객체

 

* ActionEvent, MouseEvent 많이 쓴다

* 사용자가 버튼을 클릭하는 경우에 버튼 컴포넌트가 이벤트 소그가 되어 이벤트 객체를 생성한다.

 

이벤트 처리의 과정

1. 이벤트를 발생하는 컴포넌트를 생성하여야 한다.

2. 이벤트 리스너 클래스를 작성한다.

3. 이벤트 리스너를 이벤트 소스에 등록한다.

 

내부 클래스를 사용하는 방법 : 예제로 설명

예제) 버튼이 눌러지면 버튼의 텍스트를 변경하는 프로그램을 작성하기

MyFrameTest6.java

package GUI;

 

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

 

class MyFrame8 extends JFrame {

// JButton 멤버 변수로 선언. 

// 생성자와 actionPerformed() 메서드에서 사용하기 때문에 멤버 변수로 선언하였다.

private JButton button; 

 

public MyFrame8() {

this.setSize(200, 100);

this.setDefaultCloseOperation(EXIT_ON_CLOSE);

this.setTitle("버튼 이벤트 예제");

 

JPanel panel = new JPanel();

button = new JButton("버튼을 누르세요.");

button.addActionListener(new MyListener()); // 이벤트 리스너 등록

 

panel.add(button);

this.add(panel);

this.setVisible(true);

}

 

클래스에서 이벤트를 처리하는 방법 : 예제로 설명

예제) 내부 클래스로 정의하는 방법 외에 위의 예제에서 MyFrame8 클래스가 jFrame을 상속받으면서 동시에 ActionListener 인터페이스도 구현하는 방법이다.

MyFrameTest7.java

package GUI;

 

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

 

class MyFrame8 extends JFrame implements ActionListener{

 

// JButton 멤버 변수로 선언. 

// 생성자와 actionPerformed() 메서드에서 사용하기 때문에 멤버 변수로 선언하였다.

private JButton button; 

 

public MyFrame9() {

this.setSize(200, 100);

this.setDefaultCloseOperation(EXIT_ON_CLOSE);

this.setTitle("버튼 이벤트 예제2");

 

JPanel panel = new JPanel();

button = new JButton("버튼을 누르세요.");

button.addActionListener(this); // 현재 객체를 리스너로 등록

 

panel.add(button);

this.add(panel);

this.setVisible(true);

}

 

@Override

public void actionPerformed(ActionEvent e) {

if(e.getSource() == button) { // getSource() : 이벤트 소스를 반환하는 메서드

button.setText("버튼이 눌러졌습니다.");

}

}

}

 

public class MyFrameTest7 {

 

public static void main(String[] args) {

MyFrame9 f = new MyFrame9();

}

}

 

- 내부 클래스 : 다른 클래스 안에 위치하는 클래스로, 내부 클래스에서 외부 클래스의 멤버 변수들을 자유롭게 사용 가능.

 

내부클래스의 장점

1. 내부클래스에서 외부클래스의 멤버들을 쉽게 접근할 수 있따.

2. 코드의 복잡성을 줄일 수 있다(캡슐화)

 

내부클래스는 클래스 내에 선언된 클래스로, 두 클래스가 서로 긴밀한 관계가 있을 때 내부클래스를 사용한다.

한 클래스를 다른 클래스의 내부클래스로 선언하면 두 클래스 멤버들 간에 서로 쉽게 접근할 수 있고, 외부에는 불필요한 클래스를 감춰서 코드의 복잡성을 줄일 수 있다는 장점이 있다.

 

내부클래스의 종류와 특징

인스턴스 클래스(instance class) = 외부클래스의 멤버변수 선언위치에 선언하며, 외부클래스의 인스턴스 멤버처럼 다뤄진다. 주로 외부클래스의 인턴스멤버들과 관련된 작업에 사용될 목적으로 선언된다.

스타틱 클래스(static class) = 외부클래스의 멤버변수 선언 위치에 선언하며 외부클래스의 static멤버처럼 다뤄진다.

주로 외부클래스의 static멤버, 특히 static메서드에서 사용될 목적으로 선언된다.

지역클래스(local class) = 외부클래스의 메서드나 초기화블럭 안에 선언하며, 선언된 영역내부에서만 사용될 수있다.

익명클래스(anonymous class) = 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스(일회용)

---------------------------내부클래스의 종류는 변수의 선언 위치에 따른 종류와 같다.---------------------------

 

내부클래스의 선언방법

class Outer{

         class InstanceInner { } // 인스턴스클래스

         static class StaticInner { } // 스타틱클래스

 

     void method1(){

         class LocalInner { } // 지역클래스

}

}

 


- 익명 클래스 : 클래스의 선언과 객체의 생성을 동시에 하기 때문에 단 한 번만 사용될 수 있고, 오직 하나의 객체만을 생성할 수 있는 일회용 클래스이다.

이름이 없기 때문에 생성자도 가질 수 없으며, 부모 클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의하기 때문에 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없다.

오로지 단 하나의 클래스를 상속받거나 단 하나의 인터페이스 만을 구현할 수 있다.

 

 

예시)

package test;

 

class test{

     Object iv = new Object() { void method(){ } }; // 익명클래스

     static Object cv = new Object() { }}; // 익명클래스

 

     void myMethod(){

         Object iv = new Object() { void method() { }}; // 익명클래스

}

}

 

익명클레스는 이름이 없기 때문에 "외부클래스명$숫자.class."의 형식으로 클래스 파일명이 결정된다.

코드를 컴파일 하려면 main을 넣어야 한다. test.class 외에 test$1.class, test$2class, test$3class라는

3개의 클래스 파일이 생성된다.

 

어댑터 클래스

keyEvent 와 keyListener
-component.setFocusable(true);
-component.requestFocus();

keyTyped()
MouseEvent, MouseListener, MouseMotionListener, MouseWheelListener

유니코드키
유니코드가 아닌 키
가상 키

 

 

 

 

<이벤트 처리 예제>

예제 10-1. 버튼을 클릭할 때 발생하는 Action 이벤트를 처리할 MyActionListener 클래스를 독립클래스로 작성하고 클릭할 때마다 버튼 문자열이 "Action"과 "액션"으로 번갈아 변하도록 하라.

※ 독립클래스로 Action 이벤트의 리스너 작성

package test10;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;


/*class MyAction implements ActionListener{

	@Override
	public void actionPerformed(ActionEvent arg0) {
		JButton b=(JButton)arg0.getSource();  //이벤트 발생한 소스를 얻는다
		if(b.getText().equals("Action"))
			b.setText("액션");
		else b.setText("Action");
		}
	}*/

public class EventTest01 extends JFrame {
	JButton btn;
	
	EventTest01() {
		setTitle("이벤트처리");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c=getContentPane();
		c.setLayout(new FlowLayout());
		btn=new JButton("Action");
		c.add(btn);
		setVisible(true);
		btn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				JButton b=(JButton)arg0.getSource();  //이벤트 발생한 소스를 얻는다
				if(b.getText().equals("Action"))
					b.setText("액션");
				else b.setText("Action");
	}
		});
	}
	public static void main(String[] args) {
		new EventTest01();
	}
	/*class MyAction implements ActionListener{
		@Override
		public void actionPerformed(ActionEvent arg0) {
			JButton b=(JButton)arg0.getSource();  //이벤트 발생한 소스를 얻는다
			if(b.getText().equals("Action"))
				b.setText("액션");
			else b.setText("Action");*/
}

 

 

 

예제 10-2.  10-1과 같은 내용을 내부 클래스로 이벤트 리스너를 만들어보자.

※ 내부클래스로 Action 이벤트의 리스너 작성

package test10;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

//class MyAction implements ActionListener{
//	private JTextField tf1, tf2;
//	private JLabel la;
//	MyAction(JTextField tf1, JTextField tf2, JLabel la){
//		this.tf1=tf1;
//		this.tf2=tf2;
//		this.la=la;
//	}
//	@Override
//	public void actionPerformed(ActionEvent arg0) {
//		//JButton b=(JButton)arg0.getSource();
//		int num1=Integer.parseInt(tf1.getText());
//		int num2=Integer.parseInt(tf2.getText());
//		la.setText((num1+num2)+"   ");
//		
//	}
//	
//}

public class EventTest02 extends JFrame {
	JTextField tf1, tf2;
	JLabel la; //값이 안바뀌어서 만들필요 ㄴㄴ
	JButton btn;

	EventTest02() {
		setTitle("이벤트처리");
		setSize(200, 300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c=getContentPane();
		c.setLayout(new GridLayout(4,1));
		
		JPanel p1 = new JPanel();
		JPanel p2 = new JPanel();
		JPanel p3 = new JPanel();

		tf1 = new JTextField(10);
		p1.add(new JLabel("숫자1: "));
		p1.add(tf1);

		tf2 = new JTextField(10);
		p2.add(new JLabel("숫자2: "));
		p2.add(tf2);
		
		la=new JLabel("처리결과");
		p3.add(new JLabel("계산결과"));
		p3.add(la);
		btn=new JButton("더하기");
		c.add(p1);
		c.add(p2);
		c.add(btn);
		c.add(p3);
				
		setVisible(true);
		btn.addActionListener(new MyAction());
	}

	public static void main(String[] args) {
		new EventTest02();
	}
	class MyAction implements ActionListener{
//		private JTextField tf1, tf2;
//		private JLabel la;
//		MyAction(JTextField tf1, JTextField tf2, JLabel la){
//			this.tf1=tf1;
//			this.tf2=tf2;
//			this.la=la;
//		}
		@Override
		public void actionPerformed(ActionEvent arg0) {
			//JButton b=(JButton)arg0.getSource();
			int num1=Integer.parseInt(tf1.getText());
			int num2=Integer.parseInt(tf2.getText());
			la.setText((num1+num2)+"   ");
			
		}
		
	}
}

 

예제 10-3. 10-1, 10-2와 같은 내용을 내부 클래스로 이벤트 리스너를 만들어보자.

※ 익명클래스로 Action 이벤트의 리스너 작성

대기중

 

예제 10-4. 컨탠트팬의 아무 위치에 마우스버튼을 누르면 마우스 포인트가 있는 위치로 "hello"문자열을 옮기는 스윙 응용프로그램을 작성하라. #마우스이벤트연습

package test10;

import java.awt.Color;
import java.awt.Container;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class MouseTest extends JFrame implements MouseListener{
	JLabel la;
	Container c;
	
	MouseTest(){
		setTitle("Mouse 이벤트예제");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		c=getContentPane();
		c.setLayout(null);
		la=new JLabel("Hello");
		la.setSize(50,20);
		la.setLocation(10, 10);
		c.add(la);		
		setVisible(true);
		c.addMouseListener(this);
	}
	public static void main(String[] args) {
		new MouseTest();
	}
	@Override
	public void mouseClicked(MouseEvent arg0) {
		// 좌표가 없어도 됨
		// c.setBackground(Color.RED);
	}
	@Override
	public void mouseEntered(MouseEvent e) {
		// 마우스가 화면 안에 들어올 때
		// c.setBackground(Color.BLACK);
	}
	@Override
	public void mouseExited(MouseEvent e) {
		// 마우스가 화면 밖에 나갈 때
		// c.setBackground(Color.YELLOW);
	}
	@Override
	public void mousePressed(MouseEvent e) {
		int x=e.getX();
		int y=e.getY();
		la.setLocation(x, y);  //클릭하는 위치
	}
	@Override
	public void mouseReleased(MouseEvent e) {
         // 안쓴다고 지우면 에러납니다.
        // 키를 떼는 순간
	}
}

 

 

 

예제 10-5. MouseAdapter를 이용하여 예제 10-4를 수정하라.

package test10;

import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class MouseAdapterTest extends JFrame {
	JLabel la;
	
	MouseAdapterTest(){
		setTitle("마우스어댑터테스트");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c=getContentPane();
		c.setLayout(null);
		
		la=new JLabel("Hello");
		la.setBounds(10,10,50,20);
		c.add(la);
		setVisible(true);
		
		c.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				int x=e.getX();
				int y=e.getY();
				la.setLocation(x, y);
			}
		});
	}
	public static void main(String[] args) {
		new MouseAdapterTest();
	}
}

 

 

 

예제 10-6. 입력된 키의 키코드, 유니코드, 키의 이름 문자열을 읽는 코드.

※ keyEvent와 keytListener의 활용

 

 

package test10;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class KeyEventTest01 extends JFrame implements KeyListener{
	private JLabel[] keyMessage;
	
	KeyEventTest01(){
		setTitle("keyListener 예제");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c=getContentPane();
		c.setLayout(new FlowLayout());
		c.addKeyListener(this);
		keyMessage=new JLabel[3];
		keyMessage[0]=new JLabel("getKeyCode");
		keyMessage[1]=new JLabel("getKeyChar");
		keyMessage[2]=new JLabel("getKeyText");
		
		for(int i=0; i<keyMessage.length; i++) {
			c.add(keyMessage[i]);
			keyMessage[i].setOpaque(true);  //레이블 배경은 기본이 투명. 텍스트는 아님!
			keyMessage[i].setBackground(Color.YELLOW);
		}
		setVisible(true);  
		c.setFocusable(true);  //포커스 받을 수 있게 함
		c.requestFocus();  		
	}

	public static void main(String[] args) {
		new KeyEventTest01();		
	}

	@Override
	public void keyPressed(KeyEvent arg0) {
		//눌러졌을때 키코드를 얻음
		//1번 (작동순서)
		int keyCode=arg0.getKeyCode();
		int keyChar=arg0.getKeyChar();
		String keyStr=arg0.getKeyText(keyCode);
		keyMessage[0].setText(keyCode+"");
		keyMessage[1].setText(keyChar+"");
		keyMessage[2].setText(keyStr+"");
	}

	@Override
	public void keyReleased(KeyEvent arg0) {
		//3번
//		int keyCode=arg0.getKeyCode();
//		int keyChar=arg0.getKeyChar();
//		String keyStr=arg0.getKeyText(keyCode);
//		keyMessage[0].setText(keyCode+"");
//		keyMessage[1].setText(keyChar+"");
//		keyMessage[2].setText(keyStr+"");
//		
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		//2번.유니코드만 받습니다.
//		int keyCode=arg0.getKeyCode();
//		int keyChar=arg0.getKeyChar();
//		//String keyStr=arg0.getKeyText(keyCode);
//		keyMessage[0].setText(keyCode+"");
//		keyMessage[1].setText(keyChar+"");
//		keyMessage[2].setText("");
//		
	}
}

 

 

 

예제 10-7. 다음 그림과 같이 <F1> 키를 입력받으면 콘텐트팬의 배경을 초록색으로, % 키를 입력받으면 노란색으로 변경하는 응용프로그램을 만들어라.

※ 사용자가 키를 입력하면 입력된 키의 이름 문자열을 화면에 출력한다. %키는 shift 키 입력 후 5를 입력한 경우로서 최종적으로 입력된 키는 5이므로 오른쪽 화면에 5키가 입력되었음이라고 출력되어 있다. f1키를 받기 위해 KeyEvent의 getKeycode()메소드를 이용하여야 하며, % 키는 getKeyChar() 메소드를 이용하면 된다.

 

 

 

예제 10-8. 상,하,좌,우 키를 이용하여 "Hello" 문자열을 움직이는 응용프로그램을 작성하라.

 

 

※ "Hello" 문자열은 JLabel 컴포넌트로 만들어 컨텐트팬에 부착하고 상,하, 좌,우 키를 움직이면 키 방향으로 한 번에 10픽셀씩 움직인다 이를 위해 컨텐트팬의 배치관리자를 삭제하여야 한다. "Hello" 문자열을 초기에 (50,50) 위치에 출력하라.

package test10;

import java.awt.Container;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class p1008 extends JFrame{
	JLabel la;
	int x=50, y=50;
	p1008(){
		setTitle("10장 8번 예제");
		setSize(300, 300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c=getContentPane();
		c.setLayout(null);
		la=new JLabel("Hello");
		la.setBounds(x,y,30,20);
		c.add(la);
		c.setFocusable(true);
		c.requestFocus();
		setVisible(true);
		c.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				switch((int) e.getKeyCode()) {
				case KeyEvent.VK_UP:
					if(y-10<0)
						y=0; 
					else
						y-=10;  
					break;
				case KeyEvent.VK_DOWN:
					if(y+10>c.getHeight()-20)
						y=c.getHeight()-20;
					else
						y+=10;
					break;
				case KeyEvent.VK_LEFT:
					if(x-10<0)
						x=0;
					else
						x-=10;
					break;
				case KeyEvent.VK_RIGHT:
					if(x+10>c.getWidth()-30)
						x=c.getWidth()-30;
					else
						x+=10;		
				}
				la.setLocation(x, y);
				//이미 있는 위치 옮기는 것은 repaint가 필요없음 
			}
		});
	}	
	public static void main(String[] args) {
		new p1008();
	}
}

 

 

 

예제 10-9. 입력된 키의 키코드, 유니코드, 키의 이름 문자열을 읽는 코드.

 

 

※ keyEvent와 keytListener의 활용

package test10;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class MouseEventTest02 extends JFrame{
	JLabel la;
	Container c;
	MouseEventTest02(){
		
		setTitle("10-9");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		c=getContentPane();
		c.setLayout(new FlowLayout());
		la=new JLabel("No Mouse Event");   //메모리 할당
		c.add(la);
		setVisible(true);
		
		MyMouseListener l=new MyMouseListener();
		c.addMouseListener(l);
		c.addMouseMotionListener(l);
	}

	public static void main(String[] args) {
		new MouseEventTest02();

	}
	class MyMouseListener implements MouseListener,MouseMotionListener {

		@Override
		public void mouseDragged(MouseEvent arg0) {
			la.setText("mouseDragged("+arg0.getX()+","+arg0.getY()+")");
			
		}

		@Override
		public void mouseMoved(MouseEvent arg0) {
			la.setText("mouseMoved("+arg0.getX()+","+arg0.getY()+")");
			
		}

		@Override
		public void mouseClicked(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseEntered(MouseEvent arg0) {
			c.setBackground(Color.CYAN);
			
		}

		@Override
		public void mouseExited(MouseEvent arg0) {
			c.setBackground(Color.MAGENTA);
			
		}

		@Override
		public void mousePressed(MouseEvent arg0) {
			la.setText("mousePressed("+arg0.getX()+","+arg0.getY()+")");
			
		}

		@Override
		public void mouseReleased(MouseEvent arg0) {
			la.setText("mouseReleased("+arg0.getX()+","+arg0.getY()+")");

		}
	}
}
728x90
반응형
LIST

'명품자바프로그래밍' 카테고리의 다른 글

명품 JAVA programming 11장  (0) 2021.09.30
명품 JAVA programming 9장  (0) 2021.09.29
명품 JAVA programming 7장  (0) 2021.09.28
명품 JAVA programming 6장  (0) 2021.09.28
명품 JAVA programming 5장  (0) 2021.09.28
728x90
반응형
SMALL

---------학교에서 배운 내용(개인적으로 공부한 내용), 여기서부터 이해가 필요한거 같아서 정리해서 올립니다---------

 

<<<<<<<<<<<<<<GUI 기초, AWT와 Swing>>>>>>>>>>>>>>>>>>>>>

GUI(Graphical User Interface) : 이미지나 그래픽을 이용하여 화면을 구성하고 (키보드 등)의 입력도구를 이용하여 편리하게 작성된 사용자 인터페이스다. JAVA에서 GUI를 구성하는 기본 패키지는 AWT와 스윙이 있다.

AWT : JAVA가 처음 나왔을 때 함께 배포된 GUI 라이브러리, 중량 컴포넌트로 native 운영체제의 gui 컴포넌트의 도움을 받아 작동. 운영체제에 부담을 주지만 처리속도는 빠름. java.awt 패키지에 있다.

SWING : 순수 JAVA 언어로 만들어진 라이브러리, 경량 컴포넌트. java.swing 패키지에 구현되어 있다. AWT컴포넌트 외 많은 고급 컴포넌트를 갖고 있다.

[ JFrame > 컨텐트팬 > 컴포넌트 ]

 

컨테이너 : 여러 컴포넌트를 포함할 수 있는 특별한 GUI 컴포넌트로, 내부에 반드시 하나의 배치관리자를 가진다.
- AWT 컨테이너 : Panel, Frame, Applet, Dialog, Window
- Swing 컨테이너 : JPanel, JFrame, JApplet, JDialog, JWindow

최상위컨테이너 : 다른 컨테이너에 속하지 않고 독립적으로 화면에 출력될 수 있는 컨테이너. JFrame, JDialog, JApplet

컴포넌트 : 컴포넌트 포함 불가. 컨테이너에 포함되어야 화면에 출력될 수 있는 GUI 객체. JComponent에는 스윙 컴포넌트의 공통적인 기능이 작성되어 있다.

System.exit(0); 응용프로그램 내에서 스스로 종료
main()종료 뒤에도 이벤트 분배 스레드가 살아 있음으로 프레임이 살아있다.

테스트 시 이 구문을 안쓰면 메모리에 계속 쌓이는 것을 볼 수 있음.

* 종료했을때 메모리상에서도 사라지게 하기 => frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

배치관리자 : 컨테이너 내부에 있는 배치관리자 Layout Manager가 컨테이너에 부착되는 컴포넌트의 위치와 크기를 부착 시점에 결정해줌

 

<GUI>
- FlowLayout : 왼 -> 오로 적당한 크기로 배치
- BoderLayout : 가운데정렬되어 5개 영역의 크기에 맞추어 배열. 동서남북
- GridLayout : 2차원 격자로 나누고 셀의 크기와 동일하게 배열. 바둑판
- CardLayout : 겹쳐놓은 듯 배열. 잘 안씀

 

 

contentPane.add(okBtn);
		contentPane.add(cancelBtn,BorderLayout.SOUTH);
		contentPane.add(ignoreBtn,BorderLayout.NORTH);
		contentPane.add(okBtn1,BorderLayout.WEST);
		contentPane.add(cancelBtn1,BorderLayout.EAST);

 

 

 

 

<<<<<<<9장 예제>>>>>>>>

예제 9-1. 300x300 크기의 스윙 프레임을 작성하라. (setDefaultCloseOperation이 없으면 메모리에 계속적으로 쌓입니다.)

package test09;

import javax.swing.JFrame;

public class MyFrame extends JFrame {
	MyFrame(){
		super("MyFrame");
		// setTitle("MyFrame");
		setDefaultCloseOperation(EXIT_ON_CLOSE);  //종료했을때 메모리상에서도 사라지게 하기
		setSize(300,300);   // 프레임크기 
		setVisible(true);  // 프레임출력
	}
	
	public static void main(String[] args) {
		// 자동명령어 완성 : ctrl+space
		new MyFrame();
	}
}

 

작업관리자 : ctrl + alt + delete

 

예제 9-2. 컨탠트팬의 배경색을 삽입하고, 이곳에 OK, Cancel, Ignore 버튼을 부착한 스윙 프로그램을 작성하라.

package test09;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;

public class MyFrame extends JFrame {
	MyFrame(){
		super("MyFrame");
		// setTitle("MyFrame");
		setDefaultCloseOperation(EXIT_ON_CLOSE);  //종료했을때 메모리상에서도 사라지게 하기
		setSize(300,200);   // 프레임크기 
		Container contentPane=this.getContentPane();
		contentPane.setLayout(new FlowLayout());  // 버튼을 순서대로 (안쓰면 쌓임)
		contentPane.setBackground(Color.DARK_GRAY);  // 색상은 static
		
		JButton okBtn=new JButton("OK");
		JButton cancelBtn=new JButton("Cancel");
		JButton ignoreBtn=new JButton("Ignore");  // ctrl+shift+o : import		
		
		contentPane.add(okBtn);
		contentPane.add(cancelBtn);
		contentPane.add(ignoreBtn);
				
		setVisible(true);  // 프레임출력 (명령문 다 쓰고 아래쪽에 두기)
	}
	
	public static void main(String[] args) {
		// 자동명령어 완성 : ctrl+space
		new MyFrame();
	}
}

 

package test09;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;

public class MyFrame extends JFrame {
	MyFrame(){
		super("MyFrame");
		// setTitle("MyFrame");
		setDefaultCloseOperation(EXIT_ON_CLOSE);  //종료했을때 메모리상에서도 사라지게 하기
		setSize(300,200);   // 프레임크기 
		Container contentPane=this.getContentPane();
		contentPane.setBackground(Color.RED); // 색상은 static
		 	
		JButton okBtn=new JButton("OK");
		JButton cancelBtn=new JButton("Cancel");
		JButton ignoreBtn=new JButton("Ignore");  // ctrl+shift+o : import		
		// this.setBackground(Color.GREEN); 색상은 contentPane 없으면 안됨
		this.setLayout(new FlowLayout());
		add(okBtn); add(cancelBtn);
		add(ignoreBtn);
		
		setVisible(true);  // 프레임출력 (명령문 다 쓰고 아래쪽에 두기)
	}
	
	public static void main(String[] args) {
		// 자동명령어 완성 : ctrl+space
		new MyFrame();
	}
}

 

예제 9-3. 수평 간격이 30, 수직 간격이 40픽셀이고 LEFT로 정렬 배치하는 FlowLayout 배치관리자를 가진 컨텐트팬에  버튼 컴포넌트를 부착한 스윙 응용프로그램을 작성하라.

package test09;

import java.awt.*;
import javax.swing.*;

public class p0904 extends JFrame {
	public p0904(){
		setTitle("BorderLayout Sample");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c=getContentPane();
		
		c.setLayout(new BorderLayout(30,40));
		c.add(new JButton("Calculate"), BorderLayout.CENTER);
		c.add(new JButton("add"), BorderLayout.NORTH);
		c.add(new JButton("sub"), BorderLayout.SOUTH);
		c.add(new JButton("mul"), BorderLayout.EAST);
		c.add(new JButton("div"), BorderLayout.WEST);
		
		setSize(300,200);
		setVisible(true);
	}
	public static void main(String[] args) {
		new p0904();
	}
}

 

예제 9-4. BoderLayout 배치관리자를 사용하여 컨텐트팬에 다음과 같이 5개의 버튼 컴포넌트를 삽입하라.

package test09;

import java.awt.*;
import javax.swing.*;

public class p0904 extends JFrame {
	public p0904(){
		setTitle("BorderLayout Sample");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c=getContentPane();
		
		c.setLayout(new BorderLayout(30,20));
		c.add(new JButton("Calculate"), BorderLayout.CENTER);
		c.add(new JButton("add"), BorderLayout.NORTH);
		c.add(new JButton("sub"), BorderLayout.SOUTH);
		c.add(new JButton("mul"), BorderLayout.EAST);
		c.add(new JButton("div"), BorderLayout.WEST);
		
		setSize(300,200);
		setVisible(true);
	}
	public static void main(String[] args) {
		new p0904();
	}
}

 

예제 9-5. GridLayout을 사용하여 스윙프로그램을 만들되 콘탠트팬을 4*2그리드로 분할하고 JLabel 컴포넌트와 JTextField 컴포넌트를 부착하여 만들어라. 두 행 사이의 수직 간격은 5픽셀로 하라.

*grid.setVgap(5); 간격을 나타내는 명령어

package test09;

import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class GridLayoutTest02 extends JFrame {
	String[] str= {"이름", "학번", "학과", "과목"};
	GridLayoutTest02(){
		setTitle("GridLayout Test02");
		setSize(300,300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c=getContentPane();
		c.setLayout(new GridLayout(4,2,5,5));
		for(int i=0; i<8; i++) {  // 항목이 여러개일 경우 라벨은 짝수에만 들어가는 것에 주목.
			if(i%2==0) {
				JLabel l=new JLabel(str[i/2]);
				c.add(l);
		}else {
			JTextField tf=new JTextField("");  //폭  
			c.add(tf);
		}
		}
	setVisible(true);
	}
	public static void main(String[] args) {
		new GridLayoutTest02();
	}
}

 

예제 9-6. 컨텐트팬에 배치관리자를 삭제하고 9개의 버튼과 하나의 문자열을 출력하는 프로그램을 작성하라. "Hello, Press Buttons!" 문자열은 JLabel 컴포넌트를 이용하고, 그 위치를 130,50에 크기는 200*20으로 한다. 버튼의 크기는 50*20로 한다.

* 배치관리자 없는 컨테이너에 컴포넌트를 절대 위치와 크기로 지정

import javax.swing.*; 
import java.awt.*;

public class NullContainerEx extends JFrame { 
   public NullContainerEx() {
     setTitle("Null Container Sample"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     Container c = getContentPane();
     c.setLayout(null);
     JLabel la = new JLabel("Hello, Press Buttons!");
     la.setLocation(130, 50); 
     la.setSize(200, 20); 
     c.add(la);
        for(int i=1; i<=9; i++) {
        JButton b = new JButton(Integer.toString(i)); // 버튼 생성 
        b.setLocation(i*15, i*15);
        b.setSize(50, 20);
        c.add(b); // 버튼을 컨텐트팬에 부착
        }
     setSize(300, 200); 
     setVisible(true);
     }
 public static void main(String[] args) {
    new NullContainerEx(); 
  }
}

 

 

 

 

 

<실습>

1. "Let's study Java"라는 문자열을 타이틀로 가지고 프레임의 크기가 400*200인 스윙 프로그램을 작성하라.

package test09;

import javax.swing.JFrame;

public class h0901 extends JFrame {
	h0901() {
		setTitle("Let's study Java");
		setSize(400, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		setVisible(true);
	}

	public static void main(String[] args) {
		new h0901();
	}
}

 

2. BoderLayout을 사용하여 컴포넌트 사이의 수평 수직 간격이 각각 5픽셀, 7픽셀이 되도록 스윙 응용프로그램을 작성하라.

package test09;

import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.JButton;
import javax.swing.JFrame;

public class h0902 extends JFrame {
	h0902() {
		setTitle("BorderLayout Practice");
		setSize(400, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		Container c=getContentPane();
		c.setLayout(new BorderLayout(5,7));
		
		c.add(new JButton("North"), BorderLayout.NORTH);  //대문자
		c.add(new JButton("West"), BorderLayout.WEST);
		c.add(new JButton("Center"), BorderLayout.CENTER);
		c.add(new JButton("East"), BorderLayout.EAST);
		c.add(new JButton("South"), BorderLayout.SOUTH);
		setVisible(true);
	}

	public static void main(String[] args) {
		new h0902();
	}
}

 

3. GridLayout을 사용하여 다음 그림과 같이 한 줄에 10개의 버튼을 동일한 크기로 배치하는 스윙 프로그램을 작성하라.

package test09;

import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class h0903 extends JFrame {
	h0903() {
		setTitle("BorderLayout Practice");
		setSize(600, 300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		Container c=getContentPane();
		c.setLayout(new GridLayout(1,10));
		
		for(int i=0; i<10; i++) {
				c.add(new JButton(i + ""));
		}
		setVisible(true);
	}

	public static void main(String[] args) {
		new h0903();
	}
}

 

4. 문제 3을 수정하여 다음 결과와 같이 각 버튼의 배경색을 서로 다르게 설정하라.

※ 패널-GridLayout을 사용하며 색이름은 배열과 for문을 이용.

package test09;

import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class h0904 extends JFrame {
	h0904() {
		setTitle("Ten Color Buttons Frame");
		setSize(600, 300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		Container c=getContentPane();
		c.setLayout(new GridLayout(1,10));
		
		for(int i=0; i<10; i++) {
			Color[] col= {Color.RED, Color.ORANGE, Color.YELLOW, Color.GREEN,
					Color.CYAN, Color.BLUE, Color.MAGENTA, 
					Color.GRAY, Color.PINK, Color.LIGHT_GRAY};
			String text=Integer.toString(i);
			JButton b=new JButton(text);
			b.setOpaque(true); 
			b.setBackground(col[i]);
			c.add(b);
			}	
		setVisible(true);
	}
	public static void main(String[] args) {
		new h0904();
	}
}

 

5. GridLayout을 이용하여 다음 그림과 같이 16개의 색을 배경색으로 하는 4*4 바둑판을 구성하라.

※ 16개의 JLabel 컴포넌트를 생성하고 각 레이블 컴포넌트의 배경색을 칠한다음 하나씩 GridLayout을 가진 컨테이너에 붙이면 된다.

package Luxuryjava09;

import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class h0905 extends JFrame {
	h0905() {
		setTitle("Ten Color Buttons Frame");
		setSize(600, 300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		Container c=getContentPane();
		c.setLayout(new GridLayout(4,4));
		
		for(int i=0; i<16; i++) {
			
			Color[] col= {Color.RED, Color.ORANGE, Color.YELLOW, Color.GREEN,
					Color.CYAN, Color.BLUE, Color.MAGENTA, 
					Color.GRAY, Color.PINK, Color.LIGHT_GRAY,
					Color.RED, Color.ORANGE, Color.YELLOW, Color.GREEN,
					Color.CYAN, Color.BLUE};
			JLabel label=new JLabel(i+"");
			label.setBackground(col[i]);
			label.setOpaque(true);
			c.add(label);
			}	
		setVisible(true);
	}
	public static void main(String[] args) {
		new h0905();
	}
}

 

6. 20개의 10*10 크기의 JLabel 컴포넌트가 프레임 내에 (50,50) 위치에서 (250,250) 영역에서 랜덤한 위치에 출력되도록 스윙프로그램을 작성하라. 프레임의 크기는 300*300으로 하라. 

 

 

※ JLabel 컴포넌트의 위치를 랜덤하게 설정하기 위해 (x,y) 좌표는 다음과 같이 구한다

int x = (int) (Math.random() * 200) + 50;
int y = (int) (Math.random() * 200) + 50;
label.setLocation(x,y);
label.setSize(20,20);
label.setOpaque(true);
package test09;

import java.awt.Color;
import java.awt.Container;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class h0906 extends JFrame {

	public h0906() {
		setTitle("9장 6번문제");
		setSize(300, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		Container c = getContentPane();
		c.setLayout(null);

		for (int i = 0; i < 20; i++) {
			int x = (int) (Math.random() * 200) + 50;
			int y = (int) (Math.random() * 200) + 50;
			
			//int z = (int) (Math.random() * 100) + 1;
			JLabel label = new JLabel((int)(Math.random() * 100)+"");
			// label.setLocation(x,y);
			// label.setSize(20,20);
			label.setBounds(x, y, 20, 20);
			label.setOpaque(true);
			label.setBackground(Color.red);
			c.add(label);
		}
		setVisible(true);
	}
	public static void main(String[] args) {
		new h0906();
	}
}

 

7. 다음과 같은 GUI 모양을 가진 스윙 프레임을 작성하라.

※ JButton, JLabel, JTextField 사용. 여러개의 컴포넌트와 패널을 가진 스윙 프레임으로 컨텐트팬의 NORTH, CENTER, SOUTH에 각각 JPanel을 상속받은 패널을 붙이고 그 곳에 버튼이나 JLabel을 붙이면 된다.

 

 

package Luxuryjava09;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class h0907 extends JFrame {
	
	h0907() {
		setTitle("계산기 프레임");
		setSize(400, 400);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		Container c=getContentPane();
		JPanel pn=new JPanel();
		JPanel ps=new JPanel();
		JPanel pc=new JPanel();
		
		pn.setBackground(Color.LIGHT_GRAY);
		pc.setLayout(new GridLayout(4,4));
		ps.setBackground(Color.YELLOW);

		c.add(pc);
		c.add(pn, BorderLayout.NORTH);
		c.add(ps, BorderLayout.SOUTH);
		
		JLabel l1=new JLabel("수십입력");
		JTextField tf1=new JTextField(10);
		pn.add(l1);
		pn.add(tf1);
		
		JLabel l2=new JLabel("계산결과");
		JTextField tf2=new JTextField(10);
		ps.add(l2);
		ps.add(tf2);
		
		for(int i=0; i<16; i++) {
			JButton b=new JButton();
			String[] str= {"CE","Enter","+","-","x","/"};
			pc.add(b);
			if(i<10) {
				b.setText(i+"");
			}else { 
				b.setText(str[i-10]);
			}
			if(i>11) {
				//b.setBackground(Color.CYAN);
				b.setOpaque(true);
			}
		}
		setVisible(true);
			}	
	
	public static void main(String[] args) {
		new h0907();
	}
}

 

※ 입출력이 가능한 계산기 (10장에서 이벤트를 배우면 만들 수 있다.)

package test09;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.StringTokenizer;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class h0907 extends JFrame implements ActionListener{
	String[] str = {"CE", "계산", "+", "-", "x", "%"};
	JTextField tf1, tf2;
	String numStr="";

	public h0907() {
		setTitle("계산기프레임");
		setSize(300, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		Container c = getContentPane();
		JPanel pn = new JPanel();
		JPanel ps = new JPanel();
		JPanel pc = new JPanel();

		pn.setBackground(Color.LIGHT_GRAY);
		ps.setBackground(Color.LIGHT_GRAY);
		pc.setLayout(new GridLayout(4, 4, 5, 5));

		JLabel label1 = new JLabel("수식입력");
		tf1 = new JTextField(10);
		pn.add(label1);
		pn.add(tf1);

		JLabel label2 = new JLabel("계산결과");
		tf2 = new JTextField(10);
		ps.add(label2);
		ps.add(tf2);

		for (int i = 0; i < 16; i++) {
			JButton b = new JButton();
			if (i < 10) {
				b.setText(i + ""); // 문자열. Integer.toString(i);
				b.setBackground(Color.WHITE); // 0~10까지
			} else {
				b.setText(str[i - 10]); // ce, 계산
				b.setBackground(Color.WHITE);
			}
			if (i > 11)
				b.setBackground(Color.WHITE); // 연산기호
			pc.add(b);
			b.addActionListener(this);
		}
		c.add(pc);
		c.add(pn, BorderLayout.NORTH);
		c.add(ps, BorderLayout.SOUTH);
		setVisible(true);
	}

	public static void main(String[] args) {
		new h0907();
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		String str=e.getActionCommand();
		
		if(str.equals("CE")) {
			numStr="";
			tf1.setText(numStr);
			tf2.setText("");
		}else if(str.equals("계산")) {
			StringTokenizer st=new StringTokenizer(numStr, "+-x%", true);  //구분자를 넣는다.
			int num1=Integer.parseInt(st.nextToken());
			String op=st.nextToken();
			int num2=Integer.parseInt(st.nextToken());
			switch(op) {
			case "+" : tf2.setText(num1+num2+""); break;
			case "-" : tf2.setText(num1-num2+""); break;
			case "x" : tf2.setText(num1*num2+""); break;
			case "%" : tf2.setText(num1/num2+""); break;
				default: tf2.setText("오류"); break;
			}
			numStr="";
			tf1.setText(numStr);
		}else {
			numStr+=str;
			tf1.setText(numStr);
					}
		}
}

 

8. 다음과 같은 GUI 모양을 가진 스윙프레임을 작성하라. Open Challenge의 힌트나 정답을 참고하라. 10개의 *문자는 0개의 JLabel을 이용하여 랜덤한 위치에 출력하라.

※ 여러 개의 컴포넌트와 패널을 가진 스윙 프레임 만들기

 

 

package Luxuryjava09;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.TextField;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


	class NorthPanel extends JPanel{
		public NorthPanel() {
			setBackground(Color.LIGHT_GRAY);
		//	setLayout(new FlowLayout());
			add(new JButton("Open"));
			add(new JButton("Close"));
			add(new JButton("Exit"));
		}
	}
	class CenterPanel extends JPanel{
		public CenterPanel() {
			setLayout(null);
			for (int i = 0; i < 20; i++) {
				int x = (int)(Math.random()*250);
				int y = (int)(Math.random()*250);
				JLabel label=new JLabel("*");
                label.setForeground(Color.GREEN);
				label.setLocation(x,y);
				label.setSize(20, 20);
				label.setOpaque(true);
				add(label);
				}
		}
	}
	class SouthPanel extends JPanel{
			public SouthPanel() {
			setBackground(Color.YELLOW);
			add(new JButton("Integer Input"));
			add(new TextField(15));
		}
	}
	
public class h0908 extends JFrame{
		h0908(){
			setTitle("여러 개의 패널을 가진 프레임");
			setSize(300, 300);
			setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			
	NorthPanel nP=new NorthPanel();
    CenterPanel nC=new CenterPanel();
	SouthPanel nS=new SouthPanel();
	add(nP, BorderLayout.NORTH);
	add(nS, BorderLayout.SOUTH);
	add(nC);
	setVisible(true);
	}	

	public static void main(String[] args) {
		new h0908();
	}
}

※ 입력한 숫자만큼 별을 랜덤으로 찍어서 출력하는 스윙 프레임 윈도우 만들기 (10장 내용)

package exam;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Exam08 extends JFrame {
	
	Exam08(){
		setTitle("이벤트 처리");
		setSize(300, 300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c=getContentPane();
		JPanel pn=new JPanel();
		JPanel pc=new JPanel();
		JPanel ps=new JPanel();
		JButton openBtn=new JButton("열기");
		JButton closeBtn=new JButton("닫기");
		JButton exitBtn=new JButton("나가기");
		pn.add(openBtn);
		pn.add(closeBtn);
		pn.add(exitBtn);
		JTextField charTf=new JTextField(5);
		JTextField numTf=new JTextField(5);
		JButton okBtn=new JButton("OK");
		ps.add(charTf);
		ps.add(numTf);
		ps.add(okBtn);
		pc.setLayout(null);
		pc.setBackground(Color.WHITE);
		pn.setBackground(Color.GRAY);
		ps.setBackground(Color.YELLOW);
		
		c.add(pn, BorderLayout.NORTH);
		c.add(pc);
		c.add(ps,BorderLayout.SOUTH);
		
		okBtn.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				String str=charTf.getText();
				int num=Integer.parseInt(numTf.getText());
				for(int i=0; i<num;i++) {
					int x=(int)(Math.random()*200)+10;
					int y=(int)(Math.random()*150)+10;
					JLabel la=new JLabel(str);
					la.setBounds(x, y, 10,10);
					pc.add(la);
				}
				pc.revalidate();
				pc.repaint();
			}
		});
		setVisible(true);
	}
	public static void main(String[] args) {
		new Exam08();
	}
}
728x90
반응형
LIST

'명품자바프로그래밍' 카테고리의 다른 글

명품 JAVA programming 11장  (0) 2021.09.30
명품 JAVA programming 10장  (0) 2021.09.29
명품 JAVA programming 7장  (0) 2021.09.28
명품 JAVA programming 6장  (0) 2021.09.28
명품 JAVA programming 5장  (0) 2021.09.28
728x90
반응형
SMALL

----------------------학교에서 배운 내용, 여기서부터 이해가 필요한거 같아서 정리해서 올립니다----------------------

이해안가서 다른 책 내용도 같이 적어서 올려요!!

 

<<<<<<<<<<<<<<패키지, 접근제어자, 정적변수와 메소드, 예외처리, 쓰레드>>>>>>>>>>>>>>>>>>>>>

 

7-1) 패키지

파일 여러개가 한 폴더에 뒤죽박죽 섞여 있을 때, 파일들을 성격에 맞게 분류한 다음 새 폴더에 저장시키는 식으로 

파일을 정리하는 것과 자바의 패키지는 완전히 동일한 개념으로 적용된다.

 

패키지는 비슷한 성격의 자바 클래스들을 모아 넣는 자바의 디렉토리이다.

 

HousePark, HouseKim 등의 클래스들이 있다면 이것을 house라는 패키지로 분류하면 편리할 것이다.

HouseKim.java (예시)

package jump2java.house;

public class HouseKim {
}


HousePark.java (예시)

package jump2java.house;

public class HousePark {
}


패키지를 만들때는 위 예제와 같이 package라는 키워드를 사용한다.

위 두개의 클래스를 이클립스에서 작성하고 저장하면 이클립스의 파일이 저장되는 디렉토리에 다음과 같은 구조의 파일들이 생성되는 것을 확인할 수 있다.

src/jump2java/house/HouseKim.java
src/jump2java/house/HousePark.java
bin/jump2java/house/HouseKim.class
bin/jump2java/house/HousePark.class


house라는 폴더가 자동으로 생성되고 house폴더 밑에 HouseKim과 HousePark 파일이 생성된것을 확인할 수 있다.

 


서브패키지 (Subpackage)

package jump2java.house.person; (예제)

public class EungYongPark {

}


위 예제를 보면 패키지명이 jump2java.house.person 으로 되어 있다. 

이렇게 도트(.)를 이용하여 하위 패키지를 계속해서 만들어 나갈 수 있다. 

여기서 jump2java.house.person은 jump2java.house패키지의 서브패키지라고 말한다.

EungYongPark클래스를 작성한 후 클래스가 저장되는 디렉토리를 확인 해 보자.

src/jump2java/house/HouseKim.java
src/jump2java/house/HousePark.java
src/jump2java/house/person/EungYongPark.java
bin/jump2java/house/HouseKim.class
bin/jump2java/house/HousePark.class
bin/jump2java/house/person/EungYongPark.class


person이라는 디렉토리가 생성되고, 그 밑에 EungYongPark 파일이 생성된 것을 확인할 수 있다.

즉, 패키지는 디렉토리의 구조 그대로 따라간다는 것을 확인할 수 있다.

패키지 사용하기
다른 클래스에서 HouseKim 클래스를 사용하려면 import 를 해야한다.

import jump2java.house.HouseKim;
또는 다음과 같이 * 기호를 이용할 수도 있다.

import jump2java.house.*;
"*" 를 이용하면 house 패키지내의 모든 클래스를 import 하게 된다.

만약 HouseKim과 동일한 패키지 내에 있는 클래스라면 HouseKim 클래스를 사용하기 위해서 import 를 따로 할 필요는 없다. 같은 패키지 내에서는 import 없이 사용이 가능하다.

이렇게 패키지를 이용하면 다음과 같은 이점이 있다.

클래스의 분류가 용이하다. (비슷한 것 끼리 묶는다)
패키지가 다르다면 동일한 클래스명을 사용할 수 있다.

728x90
반응형
LIST

'명품자바프로그래밍' 카테고리의 다른 글

명품 JAVA programming 10장  (0) 2021.09.29
명품 JAVA programming 9장  (0) 2021.09.29
명품 JAVA programming 6장  (0) 2021.09.28
명품 JAVA programming 5장  (0) 2021.09.28
명품 JAVA programming 4장  (0) 2021.09.28
728x90
반응형
SMALL

----------------------학교에서 배운 내용, 여기서부터 이해가 필요한거 같아서 정리해서 올립니다----------------------

이해안가서 다른 책 내용도 같이 적어서 올려요!!

 

<<<<<<<<<<<<<<입출력>>>>>>>>>>>>>>>>>>>>>

 

6-1) 콘솔 입출력

 

예시) 문자열 출력 => 생년월일(YYYY/MM/DD)을 입력해주세요

 

콘솔 출력 : 사용자에게 문자열을 보여주는 것

 

※ 콘솔은 환경에 따라 변경될 수 있다.

만약 이 프로그램을 이클립스에서 실행했다면 이클립스의 콘솔창이 콘솔이 될 것이고

도스명령창에서 이 프로그램을 실행했다면 도스명령창이 콘솔이 된다.

즉, 콘솔은 사용자의 입력을 받거나 사용자에게 문자열을 출력해 주는 역할을 하는 것을 통칭하는 말이다.

 

콘솔출력 질문에 대한 답은 사용자가 키보드로 답변을 입력한다.

 

YYYY/MM/DD

 

이렇게 사용자가 입력한 문자열이 콘솔입력이다

 

JAVA의 System.in을 이용하면 콘솔 입력을 얻을 수 있다.

System.in을 이용하기 위해서는 제일 상위에 import java.io.InputStreem을 선언해주어야 한다.

 

import java.io.InputStream;

     public class StreamTest {

          public static void main(String[] args) throws Exception {

               InputStream in = System.in;

               

               int a;

               a = in.read();

 

               System.out.println(a);

}

}

위의 예시 코드에서 사용한 InputStream은 자바의 내장 클래스다.

JAVA의 내장 클래스중에 java.lang 패키지에 속해 있지 않은 클래스는 필요할 때 항상 import 해서 사용해야 한다.

그동안 사용해 왔던 System이나 String등의 클래스는 java.lang 패키지에 속해 있는 클래스이므로 별도의 import 과정이 필요없었다.

 

 System.in은 InputStream의 객체임을 알 수 있다.

InputStream in = System.in;

 

InputStream의 read메소드는 다음처럼 1 byte의 사용자의 입력을 받아들인다.

 

   int a;

   a = in.read();

 

read메소드로 읽은 1 byte의 데이터는 byte 자료형으로 저장되는 것이 아니라 int 자료형으로 저장된다. 저장되는 int 값은 0-255 사이의 정수값으로 아스키 코드값이다.

 

 InputStream의 read()메소드가 호출되면 사용자의 입력을 받을 때까지 프로그램이 대기하기 때문에

프로그램은 종료되지 않고 사용자의 입력을 대기하고 있게 된다.

 

스트림이란?

스트림을 가장 쉽게 이해하려면 수도꼭지를 생각하면 된다. 수도꼭지를 틀면 물이 나오고 수도꼭지를 잠그면 물이 나오지 않는다. A라는 곳에서부터 B라는 곳까지 수도관이 연결되어 있고 A에서 계속 물을 보낸다면 B에서 수도꼭지를 틀때마다 물이 나오게 될 것이다. 여기서 스트림은 A수도관에서 B수도관으로 이동하는 물의 흐름이라고 할 수 있다.

프로그래밍에서는 다음과 같은 것들을 스트림이라고 할 수 있다.

  • 파일 데이터 (파일은 그 시작과 끝이 있는 데이터의 스트림이다.)
  • HTTP 응답 데이터 (브라우저가 요청하고 서버가 응답하는 HTTP 응답 데이터도 스트림이다.)
  • 키보드 입력 (사용자가 키보드로 입력하는 문자열은 스트림이다.)

사용자가 3 byte를 입력했을 때 3 byte를 전부 읽고 싶다면 어떻게 해야 할까?

 

<예제>

import java.io.InputStream;

 

public class StreamTest {

     public static void main(String[] args) throws Exception {

          InputStream in = System.in;

          

          int a;

          int b;

          int c;

 

          a = in.read();

          b = in.read();

          c = in.read();

 

          System.out.println(a);

          System.out.println(b);

          System.out.println(c);

}

}

 

read() 메소드를 3번 실행하도록 수정하고 프로그램을 다시 실행해 보면

"abc" 입력시 총 3 byte를 읽어들이는 것을 확인할 수 있다

 

abc (입력)

97 (출력)

98 (출력)

99 (출력)

 

또는 다음과 같이 좀 더 개선된 방법을 사용할 수 있다.

import java.io.InputStream;

public class StreamTest {

     public static void main(String[] args) throws Exception {

          InputStream in = System.in;

          

          byte[] a = new byte[3];

          in.read(a);

 

          System.out.println(a[0]);

          System.out.println(a[1]);

          System.out.println(a[2]);

}

}

 

길이 3 짜리 byte배열을 만든 후 read메소드 호출시 입력값으로 전달하면 콘솔 입력이 해당 배열에 저장이 된다. 

 

abc (입력)

97 (출력)

98 (출력)

99 (출력)

 

아스키코드 값으로 해석하는 방법 : 바이트 대신 문자로 입력 스트림을 읽으려면 InputStreamReader를 사용하면 된다.

 

import java.io.InputStream;

import java.io.InputStreamReader;

 

public class StreamTest {

     public static void main(String[] args) throws Exception {

          InputStream in = System.in;

          InputStreamReader reader = new InputStreamReader(in);

           char[] a = new char[3];

          reader.read(a);

 

          System.out.println(a);

}

}

 

InputStreamReader를 사용하기 위해 import 문이 하나 더 추가되었다.

InputStreamReader 객체를 생성할 때는 생성자의 입력으로 InputStream의 객체가 필요하다.

 

InputStreamReader reader = new InputStreamReader(in);

 

InputStreamReader를 이용하면 다음처럼 byte대신 char배열을 사용할 수 있게된다.

 

char[] a = new char[3];

 

프로그램을 실행하고 "abc" 입력 후 엔터키로 사용자 입력을 전달하면 다음과 같이 "abc"라는 문자열이 한꺼번에 출력되는 것을 확인할 수 있다.

 

abc (입력)

abc (출력)

 

위 예제는 항상 3 byte만 읽도록 고정되어 있다.

 

사용자가 엔터를 입력할 때까지 입력을 받아들이는 방법 : BufferedReader를 이용하면 가능하다

 

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

 

public class StreamTest {

     public static void main(String[] args) throws Exception {

          InputStream in = System.in;

          InputStreamReader reader = new InputStreamReader(in);

          BufferedReader br = new BufferedReader(reader);

 

          String a = br.readLine();

          System.out.println(a);

}

}

BufferedReader를 이용하기 위해 import 문이 추가되었다.

BufferedReader는 객체 생성시 생성자의 입력값으로 InputStreamReader의 객체가 필요하다.

 

BufferedReader의 readLine메소드를 이용하면 사용자가 엔터키를 입력할 때까지 입력했던 문자열 전부를 읽을 수 있게 된다.

 

프로그램을 실행하고 "Hello World"라고 입력한 후 엔터키를 입력하면 "Hello World"라는 문자열이 그대로 Echo되어 출력되는 것을 확인할 수 있을 것이다.

 

HelloWorld (입력)

HelloWorld (출력)

 

<<<<<<<<<<<<<<<<<<<<<<기억하기>>>>>>>>>>>>>>>>>>>>>>>>>>

  • InputStream - byte
  • InputStreamReader - character
  • BufferedReader - String

 

Scanner

J2SE 5.0 부터 Scanner 라는 java.util.Scanner 클래스가 새로 추가되었다. Scanner 클래스를 이용하면 콘솔입력을 보다 쉽게 처리 할 수 있다.

다음의 예제를 보자.

import java.util.Scanner;

 

public class Test {

     public static void main(String[] args) {

          Scanner sc = new Scanner(System.in);

          System.out.println(sc.next());

}

}

Scanner 를 사용하기 위해서는 먼저 java.util.Scanner 클래스를 import 해야 한다.

 

import java.util.Scanner;

 

Scanner 클래스는 생성자의 입력으로 System.in, 즉 콘솔입력인 InputStream 을 필요로 한다.

Scanner 객체의 next() 메소드는 단어 하나(Token)를 읽어들인다.

Scanner클래스에는 단어 뿐만 아니라 숫자, 문자열등 다양하게 읽어 들일 수 있는 여러 메소드들이 준비되어 있는데 몇가지만 알아보면 다음과 같은 것들이 있다.

 

<<<<<<<<<<<<<<<<알아두기>>>>>>>>>>>>>>>>>>>

  • next - 단어
  • nextLine - 라인
  • nextInt - 정수

콘솔 출력

 

우리는 예제들에서 System.out.println 이라는 것을 계속해서 사용해 왔다.

 

System.out은 PrintStream 클래스의 객체이다.

PrintStream은 콘솔에 값을 출력할 때 사용되는 클래스이다.

보통 System.out.println은 콘솔에 문자열을 출력할 경우나 디버깅 시 많이 사용된다.

 

System.err라는 것도 있는데 System.out과 동일한 역할을 한다.

다만 System.err는 오류메시지를 출력할 경우에 사용하게 되어 있다.

 

6-2) 파일 입출력

 

파일 쓰기


<예제>

FileWrite.java

import java.io.FileOutputStream;
import java.io.IOException;

public class FileWrite {
    public static void main(String[] args) throws IOException {
        FileOutputStream output = new FileOutputStream("c:/out.txt");
        output.close();
    }
}
위 예제를 실행해 보면 c:/ 디렉토리 바로 밑에 새로운 파일(out.txt)이 하나 생성되는 것을 확인할 수 있다.

파일을 생성하기 위해서 우리는 FileOutputStream 클래스를 사용했다. 

FileOutputStream 객체를 생성하기 위해서는 생성자의 입력으로 파일명을 넘겨주어야 한다. 

위 예제에서는 경로를 포함하여 c:/out.txt라는 파일명을 생성자의 입력으로 전달하였다.

output.close()라는 문장이 있는데 이것은 사용한 파일 객체를 닫아주는 것이다. 사실 이 문장은 생략해도 된다.

왜냐하면 자바 프로그램이 종료할 때 사용한 파일 객체를 자동으로 닫아주기 때문이다.

하지만 직접 사용한 파일을 닫아주는 것이 좋다.

사용했던 파일을 닫지 않고 다시 사용하려고 할 경우에는 에러가 발생할 수 있기 때문이다.

파일에 내용쓰기

import java.io.FileOutputStream;
import java.io.IOException;

public class FileWrite {
    public static void main(String[] args) throws IOException {
        FileOutputStream output = new FileOutputStream("c:/out.txt");
        for(int i=1; i<11; i++) {
            String data = i+" 번째 줄입니다.\r\n";
            output.write(data.getBytes());
        }
        output.close();
    }
}
InputStream과 마찬가지로 OutputStream 역시 바이트 단위로 데이터를 처리하는 클래스이다. 

FileOutputStream은 OutputStream클래스를 상속받아 만든 클래스다.

바이트 단위로 데이터를 처리하게끔 되어 있다.

FileOutputStream에 값을 쓸 때는 byte배열로 써야 한다.

String을 byte배열로 바꾸어 주는 getBytes() 메서드를 이용해야만 했다.

\r\n은 줄바꿈 문자이다. (※ 유닉스인 경우는 \n 만 있으면 된다.


문자열을 파일에 쓸 때에는 FileOutputStream이 좀 불편하다. 

String을 byte배열로 변환해야 하기 때문이다.

<더 편리한 방법, 예제>
import java.io.FileWriter;
import java.io.IOException;

public class FileWrite {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("c:/out.txt");
        for(int i=1; i<11; i++) {
            String data = i+" 번째 줄입니다.\r\n";
            fw.write(data);
        }
        fw.close();
    }
}
위 예제와 같이 FileOutputStream 대신에 FileWriter 를 이용하면 byte 배열 대신 문자열을 직접 파일에 쓸 수가 있다.

\r\n을 문자열 뒤에 덧 붙여야 하는 불편함은 FileWriter대신 PrintWriter를 사용하면 해소할 수 있다

PrintWriter를 이용하면 \r\n을 덧붙이는 대신 println이라는 메서드를 사용할 수 있게 된다.

 


<PrintWriter를 이용하여 파일을 작성하는 예제>

import java.io.IOException;
import java.io.PrintWriter;

public class FileWrite {
    public static void main(String[] args) throws IOException {
        PrintWriter pw = new PrintWriter("c:/out.txt");
        for(int i=1; i<11; i++) {
            String data = i+" 번째 줄입니다.";
            pw.println(data);
        }
        pw.close();
    }
}


위의 프로그램을 다음의 프로그램과 비교해 보자.

for(int i=1; i<11; i++) {
    String data = i+" 번째 줄입니다.";
    System.out.println(data);
}
두 프로그램의 서로 다른 점은 data를 출력시키는 방법이다. 

두 번째 방법은 우리가 지금껏 계속 사용해 왔던 콘솔 출력 방법이고 

첫 번째 방법은 콘솔대신에 파일로 출력하는 방법이다. 

차이점이 금방 눈에 들어 올 것이다. 

System.out대신에 PrintWriter를 이용했을 뿐이다.

첫 번째 예제를 작성해서 실행시키면 c:/out.txt 파일이 생성된다.

파일에 어떤 내용이 저장되었는지 확인 해 보자.

out.txt의 내용

1 번째 줄입니다.
2 번째 줄입니다.
3 번째 줄입니다.
4 번째 줄입니다.
5 번째 줄입니다.
6 번째 줄입니다.
7 번째 줄입니다.
8 번째 줄입니다.
9 번째 줄입니다.
10 번째 줄입니다.
두 번째 방법을 사용했을 때 콘솔에 출력될 내용이 파일에 고스란히 들어가 있는 것을 알 수 있다.

파일에 내용 추가하기
프로그램을 만들다 보면 파일에 내용을 쓰고 난 후에 또 새로운 내용을 추가하고 싶을 때가 생긴다. 이럴 경우에는 이미 작성된 파일을 다시 추가모드로 열어야 한다.

 

<예제>
import java.io.FileWriter;
import java.io.IOException;

public class FileWrite {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("c:/out.txt");
        for(int i=1; i<11; i++) {
            String data = i+" 번째 줄입니다.\r\n";
            fw.write(data);
        }
        fw.close();

        FileWriter fw2 = new FileWriter("c:/out.txt", true);
        for(int i=11; i<21; i++) {
            String data = i+" 번째 줄입니다.\r\n";
            fw2.write(data);
        }
        fw2.close();
    }
}
fw2라는 객체는 FileWriter("c:/out.txt", true) 와 같이 두번째 입력값이 추가로 입력되어 생성되었다. 

두번째 boolean 입력 파라미터는 파일을 추가모드(append)로 열것인지에 대한 구분값이다. 

파일을 추가모드로 열면 기존파일의 내용이후부터 파일이 쓰여지게 된다.

new FileWriter(파일명, 추가모드구분)
이제 위 예제를 실행하면 out.txt파일에 내용이 추가되는 것을 확인할 수 있을 것이다.

<<<<<<FileWriter대신 PrintWriter를 이용하고 싶은 경우 예제>>>>>>
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class FileWrite {
    public static void main(String[] args) throws IOException {
        PrintWriter pw = new PrintWriter("c:/out.txt");
        for(int i=1; i<11; i++) {
            String data = i+" 번째 줄입니다.";
            pw.println(data);
        }
        pw.close();


        PrintWriter pw2 = new PrintWriter(new FileWriter("c:/out.txt", true));
        for(int i=11; i<21; i++) {
            String data = i+" 번째 줄입니다.";
            pw2.println(data);
        }
        pw2.close();
    }
}
PrintWriter의 생성자의 입력으로 파일명 대신 추가모드로 열린 FileWriter의 객체를 사용하면 된다.

파일 읽기

<예제>
FileRead.java

import java.io.FileInputStream;
import java.io.IOException;

public class FileRead {
    public static void main(String[] args) throws IOException {
        byte[] b = new byte[1024];
        FileInputStream input = new FileInputStream("c:/out.txt");
        input.read(b);
        System.out.println(new String(b));
        input.close();
    }
}
파일을 읽기 위해서는 위 예처럼 FileInputStream 클래스를 이용하면 된다. 

byte 배열을 이용하여 파일을 읽어야 하기 때문에 읽어야 하는 정확한 길이를 모를 경우에는 좀 불편한 방법이다.

위 예에서는 1024 바이트를 읽도록 코딩했다.

<<<<<<만약 파일을 라인단위로 예제를 수정>>>>>>
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FileRead {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("c:/out.txt"));
        while(true) {
            String line = br.readLine();
            if (line==null) break;
            System.out.println(line);
        }
        br.close();
    }
}
FileInputStream 대신 FileReader와 BufferedReader의 조합을 사용하면 라인단위로 파일을 읽을 수 있다. 

BufferedReader의 readLine 메소드는 더이상 읽을 라인이 없을 경우 null을 리턴한다.

파일을 라인단위로 읽어서 출력하고 더 이상 읽을 라인이 없는 경우 while문을 빠져나간다.

728x90
반응형
LIST

'명품자바프로그래밍' 카테고리의 다른 글

명품 JAVA programming 9장  (0) 2021.09.29
명품 JAVA programming 7장  (0) 2021.09.28
명품 JAVA programming 5장  (0) 2021.09.28
명품 JAVA programming 4장  (0) 2021.09.28
명품 JAVA programming 3장  (0) 2021.09.28
728x90
반응형
SMALL

--------------------------------학교에서 배운 내용 정리해서 올립니다--------------------------------

 

<<<<<<<<<<<<<<반복문과 배열 그리고 예외 처리>>>>>>>>>>>>>>>>>>>>>

 

상속이란?

부모 클래스에서 만들어진 필드와 메소드 자식 클래스가 물려받는 것.

상속의 선언은 extend 키워드와 함께 사용한다.

 

public class Person{}
public class Student extends Person{}

장점 : 같은 속성의 수정이 필요할 경우 부모 클래스만 수정하고 여러 개의 클래스를 모두 수정할 필요가 없어 유지보수가 쉽다. 

--> 코드 중복을 제거하여 클래스를 간결하게 구현한다.

 

1. 클래스 간결화 - 멤버 중복작성 불필요

2. 클래스 관리 용이 - 클래스의 계층적 분류

3. 소프트웨어의 생산성 향상 - 클래스 재사용, 확장이 쉬움

 

 

상속의 특징 

1. 자바에서는 클래스 다중 상속 (multiple inheritance)를 지원하지 않는다. (C++은 지원한다)

--- 다중상속은 부모 클래스들이 같은 이름의 함수를 가진 경우 모호성으로 문제 유발 가능성이 있다. 자바는 이를 원천봉쇄.

 

2. 상속의 횟수에 제한이 없다.

 

3. 계층 구조의 최상위에 java.lang.Object 클래스가 있어서 자동으로 상속받도록 컴파일된다.

--- Object 클래스만이 유일하게 슈퍼클래스를 가지지 않는다.(이하 6장에서 추가 설명)​. 클래스의 최고조상님이다.

 

서브 클래스 객체 생성

서브 클래스는 슈퍼클래스의 private 멤버를 제외하고 모든 멤버를 접근할 수 있다.

 

슈퍼클래스 멤버의 접근 지정자

슈퍼클래스 멤버에 선언한 4가지 접근 지정에 대해 다른 클래스에서 어디까지 접근이 허용될까? (O : 접근가능)

Protected의 경우 같은 패키지의 모든 클래스, 그리고 패키지 상관없이 상속받는 서브 클래스에 접근이 가능하다.

슈퍼클래스 멤버에 접근하는
클래스 종류
 슈퍼 클래스 멤버의 접근 지정자
private default protected public
같은 패키지에 있는 클래스 X O O O
다른 패키지에 있는 클래스 X X X O
같은 패키지에 있는 서브 클래스 X O O O
다른 패키지에 있는 서브 클래스 X X O O

 

생성자

Q. 서브 클래스의 생성자와 슈퍼 클래스의 생성자 중 누가 먼저 실행될까? (슈퍼클래스의 생성자)

Q. 서브 클래스 객체가 생성될 때 서브클래스의 생성자와 슈퍼 클래스의 생성자가 모두 실행될까? (0)

 

--------------------------슈퍼 클래스와 서브 클래스의 생성자 간 호출 및 실행 관계도--------------------------

 

 

 

 

 

 

 

서브 클래스에서 슈퍼 클래스 생성자 선택

 

슈퍼 클래스에 여러 생성자가 있을 때 서브 클래스의 생성자와 함께 실행될 슈퍼클래스의 생성자는 원칙적으로 서브 클래스의 개발자가 각 생성자에 대해 함께 실행될 슈퍼클래스의 생성자를 지정한다. 그러나 명시하지 않았을 경우 컴파일러가 자동으로 슈퍼클래스의 기본 생성자를 호출하도록 자바 컴파일러가 작동한다.

 

슈퍼 클래스에 기본 생성자가 없을 경우 컴파일 오류 메세지를 출력한다. (Implicit super constructor A() is undefined. Must explicitly invoke another constructor

 

 

서브클래스의 생성자에서 super()를 이용하면 서브클래스에서 명시적으로 슈퍼클래스의 생성자를 선택할 수 있다. 괄호 안에 인자를 넣을 수도 있다. 요점은 super()가 반드시 생성자의 첫 줄에 사용되어야 한다는 것! (예제 5-3 참고)

 

* super() : 슈퍼 클래스 생성자를 호출하는 코드

 

 

 

 

 

 

캐스팅 Casting  :  타입 변환. 자바에서 클래스에 대한 캐스팅은 업캐스팅, 다운캐스팅이 있다.

 

 

업캐스팅 : 업캐스팅은 슈퍼 클래스의 레퍼런스로 서브 클래스의 객체를 가리키게 한다. 서브 클래스의 객체에 대한 레퍼런스를 슈퍼 클래스 타입으로 변환하는 것. 

 

Person p;
Student s = new Student();
p = s; //upcasting

 

 

다운캐스팅 : 업캐스팅의 반대이며 타입 변환을 명시적 지정해야 한다. 원래의 자기 자신으로 돌린다는 의미.

 

Student s = (Student)p; //downcasting, (student)의 타입 변환을 반드시 표시해야 됨

 

 

 

instance of 연산자 : 객체가 어떤 클래스를 상속받아 업캐스팅되어 넘어오는 지 구별하는 방법. 이항 연산자이며 레퍼런스가 가리키는 객체가 해당 클래스 타입의 객체이면 true, 아니면 false 로 계산하기 때문에 결과값은 boolean 값이다. 

 

 

* 래퍼런스 instanceof 클래스명

 

Person jee = new Student();
Person kii = new Professor();
if (jee instanceof Person) //true
if (jee instanceof Student) //true
if (kii instanceof Student) //false

// if(3 instanceof int) 객체에 대한 레퍼런스만 사용해서 문법 오류.
if ("java" instanceof String) //true

 

 

 

 

메소드 오버라이딩 method overriding : 슈퍼클래스에서 선언된 메소드와 같은 이름, 같은 리턴 타입, 같은 매개 변수 리스트를 갖는 메소드를 서브 클래스에서 재작성하는 것. 슈퍼클래스에 있는 메소드로 기능을 구현하지 못할 때 동일한 이름의 메소드를 서브클래스에 다시 작성한다. 실행 역시 서브클래스 내의 메소드만 실행된다. (= 슈퍼클래스메소드 무시, 혹은 덮어쓰기라고도 하며 동적바인딩이라고 한다.)

어떻게 호출되든 객체 안의 오버라이딩된 메소드의 호출이 무조건 보장된다. 

 

--- 메소드 오버로딩과 오버라이딩의 차이에 대해 정리해보고 넘어가기. (타 블로그 참조)

 

오버라이딩의 목적 : 다형성 실현

 

오버라이딩 제약 조건

슈퍼클래스 메소드와 동일한 원형으로 작성 (동일 이름, 동일 매개변수 타입, 동일 개수, 동일한 리턴타입의 메소드)

슈퍼클래스 메소드의 접근 지정자보다 접근의 범위를 좁혀 오버라이딩 불가 (키우는 건 가능)

static, private, final 메소드는 서브클래스에서 오버라이딩 할 수 없다.

 

 

 

 

 

<예제>

예제 5-1. 클래스 상속 만들기

x, y의 한 점을 표현하는 Point 클래스와 이를 상속받아 색을 가진 점을 표현하는 ColorPoint 클래스를 만들고 활용해보자.

(1,2)

red(3,4)

 

package Luxuryjava05;

class Point {
	private int x, y;

	// 좌표
	public void set(int x, int y) {
		this.x = x;
		this.y = y;
	}

	// 좌표 출력
	public void showPoint() {
		System.out.println("(" + x + "," + y + ")");
	}
}

class ColorPoint extends Point {
	private String color;
	// 점의 색 
	public void setColor(String color) {
		this.color = color;
	}
	public void showColorPoint() {
		// 컬러 점의 좌표 
		System.out.print(color);
		showPoint();
	}
}

public class ColorPointEx {

	public static void main(String[] args) {
		Point p = new Point();
		p.set(1, 2);
		p.showPoint();

		ColorPoint cp = new ColorPoint();
		cp.set(3, 4);
		cp.setColor("red");
		cp.showColorPoint();
	}
}

 

 

 

 

예제 5-2. 상속 관계에 있는 클래스 간 멤버 접근

클래스 Person을 아래와 같은 필드를 갖도록 선언하고, 클래스 Student는 Person을 상속받아 각 멤버 필드에 값을 저장하라.

클래스Person의 private필드 weight는 클래스Student에서 접근 불가능해 슈퍼클래스Person의 get, set 메소드를 통해서만 조작이 가능

 

private int weight;
int age;
protected int height;
public String name;
package Luxuryjava05;

class Person {
	private int weight;  // *** student 클래스 접근불가
	int age;           // 디폴트. student 클래스 접근가능
	protected int height;    // student 클래스 접근가능
	public String name;      // student 클래스 접근가능

	public void setWeight(int weight) {
		this.weight = weight;
	}

	public int getWeight() {
		return weight;
	}
}

class Student extends Person {
	public void set() {
		age = 30;
		name = "gildong";
		height = 180;
		setWeight(99);   // 간접접근
		// weight = 99; 슈퍼 클래스의 멤버 접근불가
	}
}

public class InheritanceEx {

	public static void main(String[] args) {
		Student s = new Student();
		s.set();

	}

}

 

예제 5-3. super()를 활용한 Colorpoint 작성

super()를 이용하여 Colorpoint 클래스 생성자에서 슈퍼 클래스 Point의 생성자를 호출하는 예를 보인다.

blue(5,6)

 

package Luxuryjava05;

class Point {
	private int x, y;

	public Point() {
		this.x = this.y = 0;
	}

	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

	public void showPoint() {
		System.out.println("(" + x + "," + y + ")");
	}
}

class ColorPoint extends Point {
	private String color;

	public ColorPoint(int x, int y, String color) {
		super(x, y);
		this.color = color;
	}

	public void showColorPoint() {
		System.out.println(color);
		showPoint();
	}
}

public class SuperEx {

	public static void main(String[] args) {
		ColorPoint cp = new ColorPoint(5, 6, "blue");
		cp.showColorPoint();

	}
}

 

 

 

 

예제 5-4. instanceof 연산자 활용

instanceof 연산자 활용하여 상속 관계에 따라 레퍼런스가 가리키는 객체의 타입을 알아본다. 실행 결과는 무엇인가?

new Student() -> Person Student 

new Researcher() -> Person Researcher 

new Professor() -> Person Researcher Professor 

 

package Luxuryjava05;

class Person{}
class Student extends Person {}
class Researcher extends Person {}
class Professor extends Researcher {}

public class InstanceOfEx {
	
	static void print(Person p) {
		if(p instanceof Person)
			System.out.print("Person ");
		if(p instanceof Student)
			System.out.print("Student ");
		if(p instanceof Researcher)
			System.out.print("Researcher ");
		if(p instanceof Professor)
			System.out.print("Professor ");
		System.out.println();
		
	}

	public static void main(String[] args) {
		System.out.print("new Student() -> \t");
		print(new Student());
		System.out.print("new Researcher() -> \t");
		print(new Researcher());
		System.out.print("new Professor() -> \t");
		print(new Professor());
	}

}

 

예제 5-5. 메소드 오버라이딩으로 다형성 실현

Shape의 draw() 메소드를 Line, Circle, Rect 클래스에서 목적에 맞게 오버라이딩하는 다형성의 사례

Line

Shape

Line
Rect

Circle

 

package Luxuryjava05;

class Shape {
	protected Shape next;
	protected Shape() { next = null; }
	
	protected void draw() {
		System.out.println("Shape");
	}
}

class Line extends Shape {
	protected void draw() {
		System.out.println("Line");
	}
}

class Rect extends Shape {
	protected void draw() {
		System.out.println("Rect");
	}
}

class Circle extends Shape {
	protected void draw() {
		System.out.println("Circle");
	}
}

public class MethodOverridingEx {
	static void paint(Shape p) {
		p.draw();
	}

	public static void main(String[] args) {
		Line line=new Line();
		
		paint(line);
		paint(new Shape());
		paint(new Line());
		paint(new Rect());
		paint(new Circle());

	}

}

 

728x90
반응형
LIST

'명품자바프로그래밍' 카테고리의 다른 글

명품 JAVA programming 7장  (0) 2021.09.28
명품 JAVA programming 6장  (0) 2021.09.28
명품 JAVA programming 4장  (0) 2021.09.28
명품 JAVA programming 3장  (0) 2021.09.28
명품 JAVA programming 2장  (0) 2021.09.28
728x90
반응형
SMALL

--------------------------------학교에서 배우고 있는 내용 정리해서 올립니다--------------------------------

 

<<<<<<<<<<<<<<클래스와 객체>>>>>>>>>>>>>>>>>>>>>

 

객체 지향 언어의 특징 3가지

 

캡슐화 : 클래스라는 캡슐을 사용하며 필드(멤버변수)와 메소드(멤버함수)로 구성된다.

상속 : 자식클래스(sub class)가 부모 클래스(super class)의 속성을 물려받아 사용하고 기능을 추가(extends) 하는 것.

다형성 : 같은 이름의 메소드가 클래스나 객체에 따라 다르게 동작하도록 구현되는 것.

- overriding 오버라이딩 : 슈퍼클래스를 서브클래스에서 동일한 이름으로 자신의 특징에 맞게 재구현하는 것

- overloading 오버로딩 : 클래스 내에서 이름이 같지만 서로 다르게 동작하는 메소드를 여러개 만드는 것

객체 지향 언어의 목적

소프트웨어의 생산성 향상, 실세계에 대한 쉬운 모델링

객체 : 클래스 모양대로 생성된 실체. 클래스의 인스턴스 instance. 사례

클래스 : 객체를 만들기 위한 설계도.

멤버 : 클래스의 구성 요소. 필드와 메소드 두 종류가 있다.

필드 : 객체 내 값을 저장할 멤버 변수

메소드 : 함수이며 객체의 행동을 구현

 

접근 지정자 access specifier

접근의 범위 지정. public, private, protected, default.

 

 

생성자 constructor

- new를 통해 객체가 생성될 때 자동으로 한번만 호출.

- 객체 초기화를 위해 실행되는 클래스의 이름과 동일한 메소드.

- 오버로딩 : 매개변수의 개수와 타입만 다르다면 클래스 내에 생성자를 여러 개 둘 수 있다.

- 리턴 타입을 지정할 수 없다. public Circle() {...} (x) void(x) return;(0)

 

디폴트 생성자 default constructor 

매개변수와 실행코드가 없어 아무 일도 하지 않고 단순리턴하는 생성자

 

* 객체가 생성될 때 반드시 실행되기에 생성자가 없는 클래스는 없다.

-> 생성자가 하나도 없으면 컴파일러가 생성자를 자동 생성하여 컴파일러 오류가 호출되지 않음

* 생성자가 하나라도 존재하면 기본생성자가 자동으로 삽입되지 않음

-> 컴파일오류 발생

 

class Circle{
    public Circle(){}  //기본생성자(디폴트생성자). 단순 리턴만 함
}

 

레퍼런스 변수 선언 : null로 초기화된다.

Circle 타입 크기의 메모리 할당 -> Circle() 생성자 코드 실행

Circle pizza=new Circle();

 

Circle pizza;   //레퍼런스를 가지는 변수일 뿐 아직 객체가 생성된 것이 아니다. 
pizza=new Circle();  //객체 생성은 new 연산자를 사용해서 객체를 생성한다.

 

객체 멤버 접근 : 레퍼런스 변수 뒤 점 연산자를 붙인다.

 

pizza.radius=10;   //pizza 객체의 radius 필드에 10 대입
int r=pizza.radius; //pizza 객체의 radius 필드값 읽을 때

 

this 레퍼런스 : 객체 자신을 가리키는 레퍼런스. 메소드에서 사용되며 현재 실행되고 있는 메소드가 속한 객체에 대한 참조로 컴파일러에 의해 자동 관리된다. static에서는 사용될 수 없다.

 

public Circle(int radius) {this.radius=radius;}  
                            // 멤버,     매개변수
public Circle getMe() {return this;} //객체 자신의 레퍼런스 리턴

 

this() : 클래스 내에서 생성자가 다른 생성자를 호출할 때 사용되는 자바코드.

반드시 생성자 코드에서만 호출, 같은 클래스 내 다른 생성자 호출 시 사용, 생성자의 첫 번째 문장

 

객체 배열 : 기본 타입 데이터 외 객체에 대한 레퍼런스를 원소로 갖는 배열

 

Circle[] c;    //배열에 대한 레퍼런스 선언
c=new Circle[5];    //Circle 객체에 대한 레퍼런스 생성
for(int i=0; i<c.length; i++)    //c.length는 배열 c의 크기(5)  
   c[i]=new Circle(i);    //i번째 Circle 객체 생성

 

<예제>

예제 4-1. 반지름과 이름을 가진 Circle 클래스를 작성하고, Circle 클래스의 객체를 생성하라. 그리고 객체가 생성된 모습을 그려보라.

>> 자바피자의 면적은 314.0, 등킨드나쓰의 면적은 12.56

 

package Luxuryjava04;

	public class Circle {
    
		int radius;   //원의 반지름필드 
		String name;  //원의 이름필드 

		public Circle() { }  //생성
        
		public double getArea() {
			return 3.14*radius*radius;
		}

	public static void main(String[] args) {
    
		Circle pizza; //참조변수 피자 선언 
        
		pizza=new Circle(); //원 객체 생성 
		pizza.radius=10; //피자 반지름 설정 
        
		pizza.name="자바피자"; // 피자 이름설정 
		double area=pizza.getArea(); //피자 면적알기 
        
		System.out.println(pizza.name+"의면적은"+area);
		
		Circle donut=new Circle(); //원 객체 생성 
        
		donut.radius=2; //도넛 반지름 설정
		donut.name="등킨드나쓰"; //도넛 이름설정
        
		area=donut.getArea();  //도넛 면적알기
        
		System.out.println(donut.name+"의면적은"+area);			
	}
}

 

예제 4-2. 너비와 높이를 입력받아 사각형의 합을 출력하는 프로그램을 작성하라. 너비와 높이 필드, 그리고 면적 값을 제공하는 getArea() 메소드를 가진 Rectangle 클래스를 만들어 활용하라. *객체는 new 연산자로 생성하고, .쩜 연산자로 멤버를 접근한다.

>> 4 5

사각형의 면적은 20

 

package Luxuryjava04;

import java.util.Scanner;

class Rectangle{

	int width, height;
    
	public int getArea() {
    
		return width*height;
	}
}
public class RectApp {

	public static void main(String[] args) {
    
		Rectangle rect=new Rectangle();  //객체 생성
        
		Scanner s=new Scanner(System.in);
		System.out.print(">>");
        
		rect.width=s.nextInt();
		rect.height=s.nextInt();
        
		System.out.println("사각형의 면적은 "+rect.getArea());
        
		s.close();
	}
}

 

예제 4-3. 다음 코드는 2개의 생성자를 가진 CircleA 클래스다. 실행 결과는?

>> javapizza의 면적은 314.0

oraclepizza의 면적은 3.14

 

package Luxuryjava04;

public class CircleA {
	int radius;
	String name;
    //생성자는 클래스 이름과 동일 
    
	public CircleA() { //매개변수 없는 생성자 
		radius=1; name="";  // field 초기화 
	}
	//생성자는 리턴타입 없음 
    
	public CircleA(int r, String n) {  //매개변수를 가진 생성자 
		radius=r; name=n; //매개변수로 필드 초기화 
	}
	public double getArea() {
		return 3.14*radius*radius;
	}
	
	public static void main(String[] args) {
    
		CircleA pizza=new CircleA(10, "javapizza"); 
		//객체 생성,반지름과 이름 초기화
        
		double area=pizza.getArea();
        
		System.out.println(pizza.name+"의 면적은 "+area);
		
		CircleA donut=new CircleA(); //객체 생성,반지름과 이름 초기화
		donut.name="oraclepizza";  //이름변경
        
		area=donut.getArea();
        
		System.out.println(donut.name+"의 면적은 "+area);
	}
}

 

| 예제 4-4 | 제목과 저자를 나타내는 title과 author필드를 가진 Book 클래스를 작성하고, 생성자를 작성하여 필드를 초기화하라.

>> 어린왕자 생텍쥐페리

춘향뎐 작자미상

 

package Luxuryjava04;

public class Book {
	String title, author;
	
	public Book(String t) {  //생성자로 오버로딩. 
		title=t;
		author="작자미상";
	}
	public Book(String t, String a) { //생성자로 오버로딩. 매개변수의 개수가 다름.
		title=t;
		author=a;
	}
	
	public static void main(String[] args) {
    
		Book littlePrince=new Book("어린왕자", "생텍쥐페리");
		Book llovestory=new Book("춘향뎐");
        
		System.out.println(littlePrince.title+" "+littlePrince.author);
		System.out.println(llovestory.title+" "+llovestory.author);
	}
}

 

예제 4-5. 4-4에서 작성한 Book클래스의 생성자를 this()를 이용하여 수정하라. 

>> 생성자 호출됨

춘향뎐 작자미상

 

package Luxuryjava04;

public class Book {
	String title, author;
	
	void show() {
		System.out.println(title+" "+author);
	}
	
	public Book() {
		this("","");
		System.out.println("생성자 호출됨");
	}
	
	public Book(String title) {   
		this(title,"작자미상");
	}
	public Book(String title, String author) { 
		this.title=title;
		this.author=author;
	}
	
	public static void main(String[] args) {
    
		Book littlePrince=new Book("어린왕자", "생텍쥐페리");
		Book llovestory=new Book("춘향뎐");
        
		Book emptyBook=new Book();
		llovestory.show();
	}
}

 

728x90
반응형
LIST

'명품자바프로그래밍' 카테고리의 다른 글

명품 JAVA programming 6장  (0) 2021.09.28
명품 JAVA programming 5장  (0) 2021.09.28
명품 JAVA programming 3장  (0) 2021.09.28
명품 JAVA programming 2장  (0) 2021.09.28
명품 JAVA programming 1장  (0) 2021.09.28
728x90
반응형
SMALL

--------------------------------학교에서 배우고 있는 내용 정리해서 올립니다--------------------------------

 

<<<<<<<<<<<<<<반복문과 배열 그리고 예외 처리>>>>>>>>>>>>>>>>>>>>>

 

자바의 반복문 : 중첩 반복도 여러 번 사용 가능. 반복문은 몇 번이고 중첩 반복 가능하다.

continue; 반복문 내에서 다음 반복으로 진행. break; 반복문 하나를 빠져나갈 때 사용

 

(1) for ( 초기문; 조건식; 반복 후 작업 ){ 작업문 }

반복 횟수를 알 수 있는 경우. 조건식이 비워지거나 true면 무한반복

(2) while ( 조건식 ) { 작업문 }

반복 횟수를 알 수 없는 경우. 조건식이 비워지면 컴파일 오류 발생.

(3) do{ 작업문 } while ( 조건식 )

조건식이 작업문장 뒤에 있어서 한번 이상 작업문이 수행된다.

* while과 do-while은 초기문이 없기에 구문 시작 전 변수를 초기화 해야한다.

 

배열 : 인덱스와 인덱스에 대응하는 데이터들로 이루어진 연속적인 자료 구조로서 같은 타입의 데이터들이 순차적으로 저장된다. 자바에서 객체로 다루어지며 배열을 만드는 과정은 

1) 배열 레퍼런스 변수 선언, 

2)배열 생성 과정으로 나뉜다.

배열 레퍼런스 변수 선언은 배열 객체의 주소 값을 가질 변수에 대한 선언이고 배열의 생성은 배열 원소에 대한 순차적 저장 공간을 확보하는 것이다.

배열 원소에 대한 접근은 배열 레퍼런스 변수명과 [ ] 사이에 원소의 인덱스를 적어 접근한다.

 

int [] array = new int[];    //1번방법
int array [] = new int[];    //2번방법

※ 배열의 크기는 배열 객체의 length 필드에 저장되며 첫 번째 원소의 인덱스는 0, 마지막 원소의 인덱스는 length-1이 된다. 배열의 인덱스는 정수만 가능. main() 메소드에 인자 전달은 String 타입의 배열을 이용한다.

배열의 크기 예외 : ArrayIndexOutOfBoundsException

 

배열과 for each 문

 

for (변수 : 배열레퍼런스) {반복작업문}

 

String names[]={"1", "2", "3", "4"};
for(String s:names) {
   System.out.print(s+"");
}

 메소드가 배열을 리턴하는 경우 배열 공간 전체가 아닌 레퍼런스만 리턴된다. 따라서 리턴타입 선언 시 배열의 크기를 지정하지 않는다. 또한 리턴하는 배열의 타입이 리턴받는 레퍼런스 변수의 타입과 일치해야 한다.

 

int[] makeArray={   //리턴타입 / 메소드이름
   int temp[]=new int[4];     
   return temp;    //배열리턴
}

 

main( ) 메소드

자바가 실행을 시작할 때 자바가상기계JVM에 의해 호출되어야 하므로 public 속성이다.

자신을 포함하는 클래스의 객체가 생성되기 전 처음부터 JVM에 의해 호출되므로 static이다.

아무 값도 리턴하지 않기에 void 리턴타입을 가진다. 메인메소드를 끝내기 위해 리턴하려면 return;을 사용

※ 자바는 명령행에 입력된 인자들을 문자열배열 String[] 로 만들어 메인메소드에 매개변수로 전달한다. 이클립스의 run configuriation 창에서 도 손쉽게 입력받아 전달받을 수 있다.

 

public static void main(String[] args){  //명령행인자를 전달받는 코드
    String a=args[0];
    String b=args[1];
    String c=args[2];
}

 

try-catch-finally : 자바예외발생처리문, 자바프로그램 실행 중 발생하는 오류로써 트라이캐치 블록으로 잡아 처리할 수 있는 것을 Exception이라고 부른다. 자바가 발생한 예외를 처리하는 코드를 작성해두지 않으면 프로그램은 강제 종료된다.

 

try{ }블록 : 예외가 발생할 가능성이 있는 코드

catch( ){ }블록 : 예외가 발생했을 때 처리할 코드

finally { }블록 : 예외가 발생하든 안하든 최종 실행하려는 코드로 생략 가능

 

<반복문과 배열, 예외 처리 예제>

 

1. for문을 이용하여 1부터 10까지 덧셈을 표시하고 합을 구하시오.

 

package Luxuryjava03;
public class p0301 {
	public static void main(String[] args) {
		int sum=0;
		for(int i=1; i<=10; i++) {
			sum+= i;
			System.out.print(i);
			if(i<=9)
				System.out.print("+");
			else {
					System.out.print("=");
					System.out.print(sum);
				}
		}
	}
}  // 1+2+3+4+5+6+7+8+9+10=55

 

2. -1이 입력될 때까지 입력된 수의 평균 구하기 

while은 반복 횟수를 알지 못할 경우에 이용된다고 했다. while문을 이용하여 정수를 계속 입력받아 합을 구하고 평균을 출력하는 프로그램을 만들어라. -1이 입력되면 입력을 종료한다.

 

package Luxuryjava03;
import java.util.Scanner;
public class p0302 {
	public static void main(String[] args) {
		int count=0;    // 입력된 정수의 개수 (평균값 구할 때 나눌 것)
		int sum=0;      // 합
		Scanner s=new Scanner(System.in);
		System.out.println("정수를 입력하고 마지막에 -1을 입력하세요.");
		int n=s.nextInt();
		while(n!=-1) {
			sum+=n;
			count++;
			n=s.nextInt();
		}
		if(count==0)System.out.println("입력된 수가 없습니다.");
		else {
			System.out.print("정수의 개수는 "+count+"개이며 ");
			System.out.println("평균은 "+(double)sum/count+"입니다.");
		}s.close();
	}  //  평균은 거의가 double을 사용합니다. sql도 실수값으로 생각함... 
}

 

3. do-while문을 이용하여 a부터 z까지 출력하는 프로그램을 작성하시오.

 

package Luxuryjava03;
public class p0303 {
	public static void main(String[] args) {
		char c='a';
		do {
			System.out.print(c);
			c=(char)(c+1);
		}while(c<='z');
	}
}

 

4. 2중 중첩 for문을 사용하여 한 줄에 한 단씩 구구단을 출력하는 프로그램을 작성하시오. 

 

package Luxuryjava03;
public class p0304 {
	public static void main(String[] args) {
		for(int i=1; i<10; i++) {
			for(int j=1; j<10; j++) {
				System.out.print(i+"*"+j+"="+i*j);
				System.out.print('\t');
			}
			System.out.println();
		}
	}
}

 

5. 5개의 정수를 입력 받고 그 중 양수들만 합하여 출력하는 프로그램을 만들어라. 

* continue : 반복문을 빠져 나가지 않으면서 다음 반복으로 진행

 

package Luxuryjava03;
import java.util.Scanner;
public class P0305 {
	public static void main(String[] args) {
		Scanner s=new Scanner(System.in);
		System.out.println("정수를 5개 입력하세요.");
		int sum=0;
		for(int i=0; i<5; i++) {
			int n=s.nextInt();
			if(n<=0)
				continue;    // 양수가 아닌 경우 다음반복 
			else
				sum+=n;     // 양수인 경우 더하기
		}
		System.out.println("양수의 합은 "+sum);
		s.close();
	}
}

 

6. exit이 입력되면 while문을 벗어나도록 break 문을 활용하는 프로그램을 작성하라. 

* break : 근처의 반복문을 벗어난다.

 

package Luxuryjava03;
import java.util.Scanner;
public class P0306 {
	public static void main(String[] args) {
		Scanner s=new Scanner(System.in);
		System.out.println("exit을 입력하면 종료쓰");
		while(true) {
			System.out.print(">>");
			String text=s.nextLine();    // nextLine 한줄단위입력
			if(text.equals("exit"))    // equals. 문자열 비교
				break;
		}
		System.out.println("종료데쓰...");
		s.close();
	}
}

 

7. 양수 5개를 입력받아 배열에 저장하고, 제일 큰 수를 출력하는 프로그램을 작성하라. 

 

package Luxuryjava03;
import java.util.Scanner;
public class P0307 {
   public static void main(String[] args){
   Scanner s=new Scanner(System.in);
  
   int intArray[]=new int[5];  //배열 생성
   int max=0;
   System.out.println("양수 5개를 입력하세요");
   for(int i=0; i<5; i++){   
   intArray[i] = s.nextInt();    // 입력받은 정수들을 배열에 저장
   if(intArray[i]>max)   //intArray[i]가 현재 가장 큰 수보다 크면
      max=intArray[i];
   }
  System.out.print("가장 큰 수는 "+max+"입니다.");
  s.close();
 }
}  // 양수 5개 1, 39, 78, 100, 99 중 가장 큰 수는 100입니다.

 

8. 배열의 length 필드를 이용하여 배열 크기만큼 정수를 입력받고 평균을 구하는 프로그램을 작성하라.

 

package Luxuryjava03;
import java.util.Scanner;
public class p0308 {
   public static void main(String[] args){
     int intArray[]=new int[5];
     int sum=0;

     Scanner s=new Scanner(System.in);
     System.out.print(intArray.length+"개의 정수를 입력하시오>>");
     for(int i=0; i<intArray.length; i++) {
        intArray[i]=s.nextInt();
        sum+=intArray[i];
     } 
     System.out.print("평균은 "+(double)sum/intArray.length);
     s.close();
  }
}

 

9. for-each문을 활용하는 사례를 보자. 

* for-each : for(데이터형 변수이름k : 변수이름n) ---> 반복될 때마다 k는 num[0], num[1], ...

* enum: 새로운 열거형을 선언하면 새로운 클래스형이 만들어짐

 

package Luxuryjava03;   
public class P0309 {
  enum Week{월,화,수,목,금,토,일}
   public static void main(String[] args){
   int []n= {1,2,3,4,5};
   String names[]={"사과", "배", "바나나", "체리", "딸기", "포도"};

   int smu=0;
   for(int k:n){
      System.out.print(k+" ");
      sum+=k;
   }
   System.out.println("합은"+sum);
   for(String s:names)
      System.out.print(s+" ");
   System.out.println();
   for(Week day: Week.values())
      System.out.print(day+"요일 ");
   System.out.println();
}
}

 

10. 2차원 배열에 학년별로 1,2학기 성적으로 저장하고, 4년간 전체 평점 평균을 출력하라.

 

package Luxuryjava03;
public class P0310 {
   public static void main(String[] args){
     double score[][]={{3.3, 3.4},{3.5, 3.6},{3.7, 4.0},{4.1, 4.2}};
     double sum=0;
     for(int year=0; year<score.length; year++)
        for(int term=0; term<score[year].length; term++)
          sum+=score[year][term];      //전체 평점 합(for문을 두 번 돌기에 전체 평점 합이 가능)
     int n=score.length;
     int m=score[0].length;
     System.out.println("4년 전체 평점 평균은 "+sum/(n*m));
}
}  // 4년 전체 평점 평균은 3.725

 

11. 다음 그림과 같은 비정방형 배열을 만들어 값을 초기화하고 출력하시오. 

package Luxuryjava03;
public class P0311 {
   public static void main (String[] args){
   intArray[][]=new int[4][];
   intArray[0]=new int[3];
   intArray[1]=new int[2];
   intArray[2]=new int[3];
   intArray[3]=new int[2];

   for(int i=0; i<intArray.length; i++)
     for(int j=0; j<intArray[i].length; j++)
       intArray[i][j]=(i+1)*10+j;     // 값을 초기화(입력)
   
   for(int i=0; i<intArray.length; i++){
     for(int j=0; j<intArray[i].length; j++)
        System.out.print(intArray[i][j]+" ");   //출력하면서 사이값 띄워주기
     System.out.println();
}}}

 

12. 정수 4개를 가지는 일차원 배열을 생성하고 1,2,3,4로 초기화한 다음, 배열을 리턴하는 makeArray()를 작성하고 이 메소드로부터 배열을 전달받아 값을 출력하는 프로그램을 작성하라. 

 

* 배열 리턴 과정 : int[] intArray; → makeArray(); //메소드실행 → intArray에 temp값 치환 → 초기화

package Luxuryjava03;
public class P0312 {
     static int[] makeArray(){
     int temp[] = new int[4];
     for(int i=0; i<temp.length; i++)
       temp[i]=i;     // 0, 1, 2, 3 초기화
     return temp;
     }
   public static void main(String[] args){
     int intArray[];    // 참조변수 선언
     intArray=makeArray();
     for(int i=0; i<intArray.length; i++)
       System.out.print(intArray[i]+" ");
}
}  // 0 1 2 3

 

13. 사용자가 명령행에 입력한 여러 개의 실수를 main()메소드에서 전달받아 합을 구하는 프로그램을 작성하라.

* Double.parseDouble() : 매개변수로 주어진 문자열을 실수로 변환하는 함수.

package Luxuryjava03;
public class P0313 {
   public static void main(String[] args){
     double sum=0.0;
     for(int i=0; i<args.length; i++)
       sum+= Double.parseDouble(args[i]);
     System.out.println("합계:"+sum);
   }
}

 

14. 두 정수를 입력받아 나눗셈을 하고 몫을 구하는 프로그램 코드이다. 사용자가 나누는 수에 0을 입력하면 ArithmeticException 예외가 발생하여 프로그램이 강제 종료된다. 

 

package Luxuryjava03;
import java.util.Scanner;
public class P0314 {
   public static void main(String[] args){
      Scanner s=new Scanner(System.in);
      int a, b;
      System.out.print("나눔당할 수:");
      a=s.nextInt();
      System.out.print("나눌수:");
      b=s.nextInt();
      System.out.println(a+"를"+b+"로 나누면 몫은 "+a/b+"입니다");
      s.close();
}
}

 

15. try-catch 블록을 이용하여 예제 3-14를 수정하여, 정수를 0으로 나누는 경우에 "0으로 나눌 수 없습니다!"를 출력하고 다시 입력받는 프로그램을 작성하라.

* try{ } catch(){ } (finally{ }) 예외처리문

* ArithmeticException 예외 처리

package Luxuryjava03;
import java.util.Scanner;
public class P0315 {
   public static void main(String[] args){
      Scanner s=new Scanner(System.in);
      while(true){
      System.out.print("나눔당할 수:");
      int a=s.nextInt();
      System.out.print("나눌수:");
      int b=s.nextInt();
      try{
         System.out.println(a+"를"+b+"로 나누면 몫은"+a/b+"입니다");
         break;
      }
       catch(ArithmeticException e){
          System.out.Println("0으로 나눌 수 없습니다! 다시입력하세요");
       }
      }
      s.close();
}
}

 

16. 배열의 인덱스가 범위를 벗어날 때 발생하는 ArrayIndexOutOfBoundsException을 처리하는 프로그램을 작성하시오. 

 

package Luxuryjava03;
public class P0316 {
   public static void main(String[] args){
      int[] intArray=new int[5];
      intArray[0]=0;
      try{
         for(int=0; i<5; i++){
            intArray[i+1]=i+1+intArray[i];
            System.out.println("intArray["+i+"]"+"="+intArray[i]);
         }
      }   
      catch(ArrayIndexOutOfBoundsException e){
         System.out.println("배열의 인덱스가 범위를 벗어났습니다.");
      }//  i가 4일 때
    }
}

 

17. 3개의 정수를 입력받아 합을 구하는 프로그램을 작성하라. 사용자가 정수가 아닌 문자를 입력할 때 발생하는 InputMismatchException 예외를 처리하여 다시 입력받도록 하라. 

 

package Luxuryjava03;
import java.util.Scanner;
public class P0317 {
   public static void main(String[] args){
      Scanner s=new Scanner(System.in);
      System.out.println("정수 3개를 입력하세요");
      int sum=0, n=0;
      for(int i=0; i<3; i++){
         System.out.print(i+">>");
         try{
            n=s.nextInt();
         }catch(InputMismatchException e){
             System.out.println("정수가 아닙니다. 다시 입력하세요");
             s.next();
             i--;
             continue;
         }
         sum+=n;
       }
       System.out.println("합은"+sum);
       s.close();
     }

 

18. 문자열을 정수로 변환할 때 발생하는 NumberFormatException을 처리하는 프로그램을 작성하라. 

 

package Luxuryjava03;
public class P0318 {
   public static void main(String[] args){
     String[] stringNumber={"23", "12", "3.1415", "998"};
     int i=0;
     try{
       for(i=0; i<stringNumber.length; i++){
        int j=Integer.parseInt(stringNumber[i]);
        System.out.println("숫자로 변환된 값은"+j);
         }
      }
      catch(NumberFormatException e){     // 3.1415에서 예외 발생해서 catch로 이동
          System.out.println(stringNumber[i] +"는 정수로 변환할 수 없습니다.");
      }
   }
}

 

 

 

 

 

<연습>

연습문제 3-1. 다음 프로그램의 출력 결과는 무엇인가? 그리고 무엇을 하는 코드인가?

 

1,3,5,7,9. i를 1부터 2씩 더하는 코드.

for(int i=1; i<10; i+=2) {
    System.out.print(i+"");
}

 

연습문제 3-3. 1에서 100까지 3의 배수를 더하는 while 문의 빈칸에 적절한 코드를 삽입하라.

 

continue

int sum=0, i=1;
while (i<100) {
    if(i%3 != 0) {
        i++;
        _________;
    }
    else sum += i;
    i++;
}

 

 

연습문제 3-4. 1에서 50까지의 합을 더하는 while 문이다. 빈칸에 적절한 코드를 삽입하라.

 

i>50

package Luxuryjava03;
public class y0304 {
	public static void main(String[] args) {
		int sum=0,i=1;
		while (true) {
		    if(_______) break;
		    sum+=i;
		    i++;  
		} 
		System.out.println(sum);
	}
}

 

 

 

 

 

<실습>

 

1. 다음 프로그램에 대해 물음에 답하라.

int sum=0, i=0; 

while (i<100){
   sum=sum+i;
   i+=2;
}

System.out.println(sum);

 

(1) 무엇을 계산하는 코드이며 실행 결과 출력되는 내용은?

 

 100보다 작은 짝수의 합. 2450

 

(2) 위의 코드를 main()메소드로 만들고 WhileTest 클래스로 완성하라.

package Luxuryjava03;

public class WhileTest {

	public static void main(String[] args) {
    
		int sum=0, i=0;
        
		while(i<100) {
			sum=sum+i;
			i+=2;
		}
		System.out.println(sum);
	}
}

 

(3) for 문을 이용하여 동일하게 실행되는 ForTest 클래스를 작성하라.

package Luxuryjava03;

public class ForTest {

	public static void main(String[] args) {
    
		int sum=0, i=0;
        
		for(i=0; i<100; i+=2) {
			sum=sum+i;
		}
        
		System.out.println(sum);
	}
}

 

(4) do-while 문을 이용하여 동일하게 실행되는 DowhileTest 클래스를 작성하라.

package Luxuryjava03;

public class DowhileTest {

	public static void main(String[] args) {
    
		int sum=0, i=0;
        
		do{
			sum=sum+i;
			i+=2;
            
		}while(i<100);
        
		System.out.println(sum);
	}
}

 

2. 다음 2차원 배열 n을 출력하는 프로그램을 작성하라.

int n[][] = {{1}, {1,2,3}, {1}, {1,2,3,4}, {1,2}} ;
1
1 2 3
1
1 2 3 4
1 2

※ 1*5 배열. n.length : 줄의 개수, n[i].length : i번째 줄의 배열 갯수
※ length() : 문자의 길이 / length : 배열의 길이

package Luxuryjava03;
public class h0302 {
	public static void main(String[] args) {
		int n[][] = {{1}, {1,2,3}, {1}, {1,2,3,4}, {1,2}} ;
		for(int i=0; i<n.length; i++) {
			for(int j=0; j<n[i].length; j++) {
			System.out.print(n[i][j]+" ");
		}
			System.out.println();
	   }
    }
}

 

※ 각 행별의 평균을 구하려면?

 

package Luxuryjava03;

public class h0302 {

	public static void main(String[] args) {
		int n[][] = { { 1 }, { 1, 2, 3 }, { 1 }, { 1, 2, 3, 4 }, { 1, 2 } };
		for (int i = 0; i < n.length; i++) {
			int sum = 0;

			for (int j = 0; j < n[i].length; j++) {
				System.out.print(n[i][j] + "\t");
				sum += n[i][j];
			}
			System.out.println((double) sum / n[i].length);
		}
	}
}

 

3. Scanner를 이용하여 정수를 입력받고 다음과 같이 *를 출력하는 프로그램을 작성하라. 다음은 5를 입력받았을 경우이다. 

정수를 입력하시오 >> 5

*****
****
***
**
*

 

※ for문, 변수 2개

package Luxuryjava03;
import java.util.Scanner;

public class h0303 {
	public static void main(String[] args) {
		System.out.println("정수를 입력하시오>>");
        Scanner s=new Scanner(System.in);
		int n=s.nextInt();

	for(int i=0; i<n; i++) {
		for(int j=0; j<n-i; j++) {     
			System.out.print("*");
		}
		System.out.println();
	}
	s.close();
	}
}

 

별 반대로 찍기

package Luxuryjava03;
import java.util.Scanner;
public class h0303 {
	public static void main(String[] args) {
		System.out.print("정수를 입력하시오>>");
		Scanner s=new Scanner(System.in);
		int n=s.nextInt();
		for(int i=0; i<n; i++) {
			for(int j=0; j<=i; j++) {
					System.out.print('*');
			}
			System.out.println();
		}
	s.close();
	}
}

 

피라미드 별찍기

 

package Luxuryjava03;
import java.util.Scanner;
public class h0303 {
	public static void main(String[] args) {
		System.out.print("정수를 입력하시오>>");
		Scanner s=new Scanner(System.in);
		int n=s.nextInt();

		for(int i=0; i<n; i++) {
			for(int j=1; j<n-i; j++) {
					System.out.print(" ");
			}
			for(int k=0; k<i*2+1; k++) {
				System.out.print("*");
			}
			System.out.println();
		}
	s.close();
	}
}
package Luxuryjava03;
import java.util.Scanner;
public class h03032 {
	public static void main(String[] args) {
		System.out.print("정수를 입력하시오>>");
		Scanner s=new Scanner(System.in);
		int n=s.nextInt();
     	System.out.println();

        for (int i=0; i<n; i++) {   // i=0,1,2,3,4
          for (int j=n-1; j>i; j--) { 
                   // i=0 j=4,3,2,1 / i=1 j=4,3,2 / i=2 j=4,3 / i=3 j=4 / i=4 (i=j 므로 제외)
                   // j는 4부터 시작하여 i보다 클때까지 - 
            System.out.print(" ");
        }
          for (int k = 1; k <= i*2+1; k++) {  //k는 1부터 시작
            System.out.print("*"); //  i 가  0 -->0*2+1 1 1  =         1 
                                    // i 가 1 -->1*2+1  3 3 <=       1,2,3
                                    // i 가 2 -->2*2+1  5 5 <=     1,2,3,4,5
                                    // i 가 3 -->3*2+1  7 7 <=   1,2,3,4,5,6,7
                                    // i 가 4 -->4*2+1  9 9 <= 1,2,3,4,5,6,7,8,9                    
          }
        System.out.println();
    } 
package Luxuryjava03;
import java.util.Scanner;
public class  h03032 {
	public static void main(String[] args) {
		System.out.print("정수를 입력하시오>>");
		Scanner s=new Scanner(System.in);
		int n=s.nextInt();
     	System.out.println();
 
   for(int i=0; i<n; i++){     // 0, 1, 2, 3, 4
     	for(int j=1; j<n-i; j++){      // i=0 2<
            System.out.print(" ");
     	}
		for(int k=0; k<i*2+1; k++){    // +1: 홀수. 홀수여야 양쪽 동일.
			System.out.print("*");
		}
		System.out.println(" ");
	}
	s.close();
	}
}

 

※ 문자열을 정수로 변환할 때 다음 코드를 이용하라.

int i = Integer.parseInt("10");   // i는 10
728x90
반응형
LIST

'명품자바프로그래밍' 카테고리의 다른 글

명품 JAVA programming 6장  (0) 2021.09.28
명품 JAVA programming 5장  (0) 2021.09.28
명품 JAVA programming 4장  (0) 2021.09.28
명품 JAVA programming 2장  (0) 2021.09.28
명품 JAVA programming 1장  (0) 2021.09.28

+ Recent posts