AWS 클라우드환경 네이티브 수업 62일차
진행
1. 다형성 예제
2. Vector 클래스
3. interface
4. Java GUI 활용
조퇴에에엥에에엑~~~~~
요약
1. Vector 클래스
2. interface
3. Java GUI 활용
(프레임 만들기, 버튼 추가, 배치관리자, 배경색 설정, 이미지 삽입)
다형성 예제
package object;
class Product{
int Price;
int bonusPoint;
Product(int Price){
this.Price = Price;
bonusPoint = (int)(Price/10);
}
Product(){
Price = 0;
bonusPoint = 0;
}
}
class TV extends Product{
TV(){
super(100); // 부모클래스 생성자 먼저 호출.
}
public String toString() {
return "TV";
}
}
class Notebook extends Product{
Notebook(){
super(200); // 부모클래스 생성자 먼저 호출.
}
public String toString() {
return "Notebook";
}
}
class Audio extends Product{
public String toString() {
return "오디오";
}
}
class Buyer{
int money = 1000;
int bonusPoint = 0;
Product[] item = new Product[10]; // 구매 제품 정보 저장
int counter = 0;
void buy(Product p) {
if(money < p.Price) {
System.out.println("잔액이 모자라서 " + p + "를 살 수가 없습니다.");
return;
}
money -= p.Price;
item[counter++] = p;
bonusPoint += p.bonusPoint;
System.out.println(p + " 를 " + p.Price + "만원을 주고 구매했습니다.");
}
// 구매 제품 정보
void summary() {
int sum = 0;
String itemlist = "";
for(int i = 0 ; i < item.length ; i++) {
sum += item[i].Price;
if(item[i+1] == null) {
itemlist += item[i];
break;
}
itemlist += item[i] + ", ";
// 위와 같은 걸 아래의 삼항연산자로도 표현이 된다.
// itemlist += (i==0) ? "" + item[i] : ", " + item[i];
}
System.out.println("구입하신 제품들의 총 금액은 " + sum + "만원입니다. ");
System.out.println("구입하신 제품들은 " + itemlist + " 입니다. ");
}
}
public class Lecture2 {
public static void main(String[] args) {
Buyer b = new Buyer();
TV tv = new TV();
Notebook nb = new Notebook();
Audio ad = new Audio();
b.buy(tv);
b.buy(nb);
b.buy(ad);
b.buy(nb);
b.summary();
System.out.println("현재 남은 돈 : " + b.money + "만원 입니다.");
System.out.println("현재 보너스 점수는 " + b.bonusPoint + "만 포인트 입니다.");
}
}
결과
TV 를 100만원을 주고 구매했습니다.
Notebook 를 200만원을 주고 구매했습니다.
오디오 를 0만원을 주고 구매했습니다.
Notebook 를 200만원을 주고 구매했습니다.
구입하신 제품들의 총 금액은 500만원입니다.
구입하신 제품들은 TV, Notebook, 오디오, Notebook 입니다.
현재 남은 돈 : 500만원 입니다.
현재 보너스 점수는 50만 포인트 입니다.
Vector 클래스
컬렉션 프레임워크(Collection Framework)가 존재하기 전에 추가된 레거시 클래스 중 하나.
ArrayList와 동일한 내부구조를 가지고 있다.
ArrayList와 마찬가지로 Vector 내부에 값이 추가되면 자동으로 크기가 조절되고
데이터들은 한 자리씩 뒤로 이동된다.
Vector는 동기화를 제공하기 때문에 멀티 스레드 환경에서 안전(Thread Safe)하다.
대신 동기화로 인해 ArrayList보다 성능이 낮다.
=> 동기화가 필요하지 않을 때는 ArrayList를 사용하는 것을 추천.
=> 안정성은 Vector가 좋음
1. 값 추가 - add()
아래의 두 가지 용법이 있다.
// Vector의 마지막에 데이터를 추가
add(값)
// Vextor의 Index위치에 데이터를 추가하면서 해당 위치부터의 데이터는 뒤로 밀린다.
add(Index, 값)
참고로 null도 추가가 가능하다.
아래의 예를 보자.
import java.util.Vector;
public class Test {
public static void main(String[] args) {
Vector a = new Vector();
a.add("111");
a.add("222");
a.add(1, "Hi");
a.add(null);
System.out.print(a);
}
}
결과
111, Hi, 222, null
2. 값 제거 - remove()
구조는 아래와 같다.
// 해당 인덱스 제거
remove(Index)
// 전체 인덱스 제거
clear()
3. 값 수정 - set()
// 해당 인덱스의 데이터를 바꿔준다.
set(int Index, 값)
4. 값 출력 - get()
// 얻어오길 원하는 데어터의 Index의 값을 넣는다
get(Index)
5. Vector 가 비어있니? - isEmpty()
// 벡터가 비어있으면 true
isEmpty()
6. 크기 구하기 - size()
// Vector 데이터의 개수를 구함
size()
아래의 활용 예를 보면서 이해해보자~
package object;
import java.util.Vector;
class Product{
int Price;
int bonusPoint;
Product(int Price){
this.Price = Price;
bonusPoint = (int)(Price/10);
}
Product(){
Price = 0;
bonusPoint = 0;
}
}
class TV extends Product{
TV(){
super(100); // 부모클래스 생성자 먼저 호출.
}
public String toString() {
return "TV";
}
}
class Notebook extends Product{
Notebook(){
super(200); // 부모클래스 생성자 먼저 호출.
}
public String toString() {
return "Notebook";
}
}
class Audio extends Product{
Audio(){
super(50); // 부모클래스 생성자 먼저 호출.
}
public String toString() {
return "오디오";
}
}
class Buyer{
int money = 1000;
int bonusPoint = 0;
Vector item = new Vector(); // 구매 제품 정보 저장
int counter = 0;
void buy(Product p) {
if(money < p.Price) {
System.out.println("돈 부족해 더 가져와");
return;
}
money -= p.Price;
// add 사용
item.add(p);
bonusPoint += p.bonusPoint;
System.out.println(p + "를 구매했습니다.");
}
void refund (Product p) {
// remove 사용
if(item.remove(p)) {
money += p.Price;
bonusPoint -= p.bonusPoint;
System.out.println(p + "를 반품하였습니다.");
} else {
System.out.println("구매하신 제품 중에 해당하는 제품이 없습니다.");
}
}
// 구매 제품 정보
void summary() {
int sum = 0;
String itemlist = "" ;
// isEmpty 사용
if(item.isEmpty()) {
System.out.println("구매하신 제품이 하나도 없습니다.");
return;
}
// size 사용
for(int i = 0 ; i< item.size() ; i++ ) {
// get 사용
Product p = (Product)item.get(i);
sum += p.Price;
itemlist += (i==0) ? "" + p : ", " + p;
}
System.out.println("구입하신 제품들의 총 금액은 " + sum + "만원입니다. ");
System.out.println("구입하신 제품들은 " + itemlist + " 입니다. ");
}
}
public class Lecture2 {
public static void main(String[] args) {
Buyer b = new Buyer();
TV tv = new TV();
Notebook nb = new Notebook();
Audio ad = new Audio();
b.buy(tv);
b.buy(nb);
b.buy(ad);
b.buy(nb);
b.summary();
System.out.println();
b.refund(tv);
b.summary();
}
}
결과
TV를 구매했습니다.
Notebook를 구매했습니다.
오디오를 구매했습니다.
Notebook를 구매했습니다.
구입하신 제품들의 총 금액은 550만원입니다.
구입하신 제품들은 TV, Notebook, 오디오, Notebook 입니다.
TV를 반품하였습니다.
구입하신 제품들의 총 금액은 450만원입니다.
구입하신 제품들은 Notebook, 오디오, Notebook 입니다.
interface
원래는 안되는 자식 클래스의 다중 상속을 지원하기 위해 만들어진 녀석이다.
다중 상속을 위해 오로지 추상 메소드와 상수만을 포함할 수 있다.
또한, 직접 인스턴스를 생성할 수는 없다.
인터페이스는 추상클래스와 비슷하지만 더 확실한 장점이 있다.
- 코딩 내용의 표준화가 가능하다.
- 다중 상속으로 인한 개발 시간을 단축
- 클래스와 클래스 간의 관계를 인터페이스로 연결하면 클래스마다 독립적인 프로그래밍이 가능
인터페이스의 구조는 아래와 같다.
인터페이스의 모든 필드는 public static final이어야 하며, 모든 메소드는 public abstract이어야 한다.
접근제어자 interface 인터페이스이름 {
public static final 타입 상수이름 = 값;
public abstract 메소드이름(매개변수목록);
}
만들어진 인터페이스를 구현(상속) 하는 방법은 아래와 같다.
class 클래스이름 implements 인터페이스이름 {
}
아래의 예를 보면서 이해해보자
interface Animal { public abstract void sound(); }
interface Name { public abstract void name(); }
class Cat implements Animal, Name {
public void sound() {
System.out.println("냐옹!");
}
public void name() {
System.out.println("길냥이");
}
}
class Dog implements Animal, Name {
public void sound() {
System.out.println("멍!");
}
public void name() {
System.out.println("흰둥이");
}
}
public class Test {
public static void main(String[] args) {
Cat c = new Cat();
Dog d = new Dog();
c.sound();
c.name();
d.sound();
d.name();
}
}
결과
냐옹!
길냥이
멍!
흰둥이
Java GUI 활용
기본적인 그림 그리기와 JFrame 에 대한 설명은
8/9 Java GUI 맛보기 를 참고하자
1. 기본적인 프레임 만들기
Frame : 전체 창
Content Pane : 창 안의 내용물부분 배경 전체, 이 안에 각종 컴포넌트들을 넣을 수 있다.
package swing.frame;
import javax.swing.JFrame;
public class MyFrame extends JFrame{
// 위치 지정을 따로 안하면 0,0 좌표에 창이 나옴
MyFrame() {
setTitle("나의 첫번째 프레임"); // 프레임 맨 위 창의 제목
setSize(400, 400); // 프레임 사이즈 지정
setVisible(true); // 참으로 해줘야 눈에 보임
}
public static void main(String[] args) {
MyFrame mf = new MyFrame();
}
}
2. 프레임 닫기 활성화, 컨탠트팬 설정, 버튼 만들기
프레임 닫기
//응용프로그램 내에서 스스로 무조건 종료하는 방법
System.exit(0);
// 프레임 종료버튼이 클릭될 때 프레임과 함께 프로그램을 종료시키는 방법
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
프레임의 우측 상단의 종료버튼(x)이 클릭이 되면 프레임 종료, 프레임 윈도우를 닫는다.
프레임이 보이지 않게 되지만 응용프로그램이 종료된 것은 아님.
키보드나 마우스등의 입력을 받지 못할 뿐이다.
다시 setVisible(true)를 호출하면 보이게 되고 이전처럼 작동.
Button
사용자가 클릭했을 때 어떤 작업이 수행되도록 할 때 사용하는 컴포넌트.
// 지정된 label을 가진 Button을 생성.
Button(String label)
// Button에 나타나있는 text를 가져온다.
String getLabel()
// Button에 나타나있는 text를 변경
void setLabel(String label)
아래 예시를 보며 이해해보자.
package swing.frame;
import java.awt.*;
import javax.swing.JButton;
import javax.swing.JFrame;
public class MyFrame extends JFrame{
MyFrame() {
setTitle("ContentPane과 JFrame 실습하기");
// 우측 상단의 x버튼을 활성화시킨다.
// 메모리 자체에서 닫기를 하는 역할
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane(); // 컨텐트팬의 정보를 알아내기
contentPane.setBackground(Color.RED); // 배경색 바꾸기
contentPane.setLayout(new FlowLayout()); // 컨텐트팬에 배치관리자를 설정
// 버튼 생성
contentPane.add(new JButton("OK"));
contentPane.add(new JButton("Cancel"));
contentPane.add(new JButton("Ignore"));
setSize(500, 400); // width, height
setVisible(true);
}
public static void main(String[] args) {
new MyFrame();
}
}
버튼을 넣을 때 쓴 아래의 구문,
contentPane.add
이건 패널이나 버튼 등을 컨탠트 팬에 넣는 구문이다.
컨테이너의 배치관리자
- 컨테이너마다 하나의 배치관리자가 존재
- 컨테이너에 부착되는 컴포넌트의 위치와 크기 결정.
- 컨테이너의 크기가 변경되면 컴포넌트의 위치와 크기가 재결정.
배치관리자의 대표유형
- FlowLayout
- BorderLayout
- GridLayout
- CardLayout (아래에 예제 따로 없음)
: 컨테이너의 공간에 카드를 쌓아 놓은 것처럼 컴포넌트를 포개서 배치.
3. 배치관리자 - FlowLayout 사용하기
FlowLayout 은 배치 관리자 중 하나이다.
가운데부터 시작해서 왼쪽으로 컴포넌트가 밀리면서 오른쪽으로 배치를 하며
오른쪽 공간이 없으면 아래로 배치를 한다.
사용은 아래처럼 한다.
정렬시작이 LEFT 라면 왼쪽부터 정렬이 시작된다는 의미.
간격은 컴포넌트 간의 간격이다.
contentPane.setLayout(new FlowLayout(FlowLayout.정렬시작부분, 좌우간격, 상하간격));
예시를 보자
package swing.frame;
import java.awt.*;
import javax.swing.*;
public class MyFrame extends JFrame{
MyFrame() {
setTitle("FlowLayout 연습");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
// 배치관리자
contentPane.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 40));
contentPane.add(new JButton("plus"));
contentPane.add(new JButton("minus"));
contentPane.add(new JButton("multiply"));
contentPane.add(new JButton("divide"));
contentPane.add(new JButton("Calculate"));
setSize(400, 300);
setVisible(true);
}
public static void main(String[] args) {
new MyFrame();
}
}
4. 배치관리자 - BorderLayout 사용하기
배치관리자 중 하나로,
동/서/남/북/중앙 총 5개의 영역으로 나누어 주는 관리자이다.
사용은 아래와 같다.
간격은 각 컴포넌트간의 간격이다.
contentPane.setLayout(new BorderLayout(좌우간격, 상하간격));
예시를 보자.
버튼 생성 시, 배치관리자로 버튼의 생성 위치도 같이 지정해주었다.
만약, 버튼을 한 개만 만들었다면 컨탠트팬 전체를 해당 버튼으로 채우게 된다.
package swing.frame;
import java.awt.*;
import javax.swing.*;
public class MyFrame extends JFrame{
MyFrame() {
setTitle("BorderLayoutExam 연습");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
// 배치관리자
contentPane.setLayout(new BorderLayout(30, 20));
// 각 버튼이 어디에 위치할지를 정한다.
contentPane.add(new JButton("Calcultate"), BorderLayout.CENTER);
contentPane.add(new JButton("add"), BorderLayout.NORTH);
contentPane.add(new JButton("sub"), BorderLayout.SOUTH);
contentPane.add(new JButton("mul"), BorderLayout.EAST);
contentPane.add(new JButton("div"), BorderLayout.WEST);
setSize(400, 300);
setVisible(true);
}
public static void main(String[] args) {
new MyFrame();
}
}
5. 배치관리자 - GridLayout 사용하기.
2차원 그리드로 n x n 으로 설정을 해준다.
방향은 왼쪽에서 오른쪽, 위에서 아래로.
사용은 아래와 같다.
가로 x 세로 로 설정된다.
contentPane.setLayout(new GridLayout(가로, 세로, 좌우간격, 상하간격));
예시를 보자.
package swing.frame;
import java.awt.*;
import javax.swing.*;
public class MyFrame extends JFrame {
public MyFrame() {
super("GridLayout 연습");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
// 2x5 짜리 간격 10의 GridLayout 배치관리자를 설정.
contentPane.setLayout(new GridLayout(2, 5, 10, 10));
// 10개의 버튼을 부착.
for(int i = 0; i < 10; i++) {
String text = Integer.toString(i+1);
JButton button = new JButton(text);
contentPane.add(button);
}
setSize(500, 400);
setVisible(true);
}
public static void main(String[] args) {
new MyFrame();
}
}
6. 배치관리자가 없는 Layout
각 컴포넌트마다 수동으로 배치를 할 때 사용한다.
사용은 아래와 같다.
contentPane.setLayout(null);
예시를 보자.
package swing.frame;
import java.awt.*;
import javax.swing.*;
public class MyFrame extends JFrame{
MyFrame() {
super("배치관리자 없이 절대 위치에 버튼을 배치하기");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
// 컨텐트팬의 배치관리자를 제거한다.
contentPane.setLayout(null);
JLabel la = new JLabel("How are you?");
la.setLocation(300, 0); // 라벨의 놓이는 기준 위치
la.setSize(700, 250); // 라벨의 폭, 높이
contentPane.add(la);
// 버튼을 9개 생성하고 사선방향으로 살짝 겹치게 배열
for(int i = 1; i <= 9; i++) {
// Integer.toString(i) => 정수를 문자열로 변환
JButton bt = new JButton(Integer.toString(i));
bt.setLocation(i*25, i*25); // 버튼이 놓이는 기준 위치
bt.setSize(100, 30); // 버튼 폭, 높이
contentPane.add(bt);
}
setSize(500, 400);
setVisible(true);
}
public static void main(String[] args) {
new MyFrame();
}
}
버튼을 겹치게 만드는 방법은
현재 버튼의 높이가 30인데
버튼의 높이보다 살짝 작은 숫자로 기준위치를 잡아주면 겹치게 생성이 된다.
7. JComponent 클래스의 메소드 활용하기
object 아래의 container를 제외하고 거의 모든 컴포넌트가 JComponent를 상속받는다.
JComponent 는 스윙 컴포넌트의 최상위 클래스로
Component와 Container 클래스를 상속받는다.
- Component 클래스는 화면 그리기 / 이벤트 처리 기능 제공.
- Container 클래스는 컴포넌트 추가 및 제거 기능 / 레이아웃 기능 제공.
따라서, JComponent 는 위의 기능 다 활용 가능하다.
컴포넌트의 외관 변경 메소드
설명 | |
void setBorder(Border border) Border getBorder() |
컴포넌트의 경계를 설정하거나 반환한다. |
void setForeground(Color color) Color getForeground() |
컴포넌트의 전경색을 설정하거나 반환한다. |
void setBackground(Color color) Color getBackground() |
컴포넌트의 배경색을 설정하거나 반환한다. |
void setFont(Font font) Font getFont() |
컴포넌트의 폰트를 설정하거나 반환한다. |
void setCursor(Cursor cursor) Cursor getCursor() |
컴포넌트의 커서를 설정한다. |
컴포넌트의 상태 변경 메소드
설명 | |
void setToolTipText(String text) | 툴팁에 표시되는 텍스트를 설정한다. * 툴팁 : 컴포넌트에 마우스를 두면 표시됨 |
void setName(String name) String getName() |
컴포넌트의 이름을 설정하거나 반환한다. |
boolean isShowing() | 컴포넌트가 화면에 표시되고 있으면 true, 표시되지 않으면 false를 반환한다. |
void setEnabled(boolean enabled) boolean isEnabled() |
컴포넌트의 활성화 여부를 설정하고 반환한다. |
void setVisible(boolean visible) boolean isVisible() |
컴포넌트를 화면에 표시할지를 설정하고 표시 여부를 반환한다. |
공통 이벤트 처리 메소드
설명 | |
void addMouseListener(MouseListener mouseListener) | 마우스 리스너를 추가한다. |
void removeMouseListener(MouseListener mouseListener) | 마우스 리스너를 제거한다. |
void addActionListener(ActionListener actionListener) | 액션 리스너를 추가한다. |
void removeActionListener(ActionListener actionListener) | 액션 리스너를 제거한다. |
... | 각 리스너마다 메소드가 addXXXX(), removeXXXX() 형태로 존재 |
컴포넌트의 위치와 크기에 관련된 메서드
// 폭을 리턴
int getWidth()
// 높이 리턴
int getHeight()
// x좌표 리턴
int getX()
// y좌표 리턴
int getY()
// 스크린 좌표상에서의 컴포넌트 좌표
Point getLocationOnScreen()
// 위치 지정
void setLocation(int, int)
// 크기 지정
void setSize(int, int)
JLabel
문자열이나 이미지를 화면에 출력하기 위한 목적으로 사용.
JLabel()
JLabel(icon image)
JLabel(String text)
JLabel(String text, Icon image, int hAlign)
// hAlign : 수평 정렬 값
// -> SwingContants.LEFT, SwingContants.RIGHT, SwingContants.CENTER
예시를 보면서 이해해보자~
package swing.frame;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MyFrame extends JFrame{
MyFrame() {
super("JComponent의 공통 메서드 연습");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
JButton b1 = new JButton("Magenta/Yellow Button");
JButton b2 = new JButton("Disabled Button");
JButton b3 = new JButton("getX(), getY()");
// 버튼의 배경색 설정
b1.setBackground(Color.YELLOW);
// 버튼의 전경색 설정
b1.setForeground(Color.MAGENTA);
// 버튼의 폰트 설정
b1.setFont(new Font("ARIAL", Font.ITALIC, 20));
// 버튼의 황설화 여부 설정
b2.setEnabled(false);
// b3버튼에 액션 리스너를 추가한다.
b3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JButton b = (JButton)e.getSource(); // 컴포넌트의 진원지를 알 수 있음
// 프레임 제목에 b3의 x,y 좌표를 보여준다.
setTitle(b.getX() + ", " + b.getY());
}
});
c.add(b1); c.add(b2); c.add(b3);
setSize(500, 300);
setVisible(true);
}
public static void main(String[] args) {
new MyFrame();
}
}
8. 이미지를 이용한 버튼 만들기
이제는 버튼 안에 글자뿐만이 아니라 이미지까지 추가를 해보려고 한다.
아래의 예를 보면서 이해해보자.
package swing.component;
import java.awt.*;
import java.net.URL;
import javax.swing.*;
public class ButtonImageExam extends JFrame {
ButtonImageExam() {
setTitle("이미지 버튼 연습");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
// 이미지 파일을 넣은 경로를 적는다.
// 원하는 변수에 이미지를 매칭
ImageIcon normalIcon = new ImageIcon("src/swing/image/normalIcon.gif");
ImageIcon pressedIcon = new ImageIcon("src/swing/image/pressedIcon.gif");
ImageIcon rolloverIcon = new ImageIcon("src/swing/image/rolloverIcon.gif");
// 버튼에 이미지와 함께 들어갈 문구(call) 추가
JButton btn = new JButton("call", normalIcon);
// 버튼을 눌렀을 때 이미지 설정
btn.setPressedIcon(pressedIcon);
// 버튼에 커서를 갖다댔을 때 이미지 설정
btn.setRolloverIcon(rolloverIcon);
c.add(btn);
setSize(250, 160);
setVisible(true);
}
public static void main(String[] args) {
new ButtonImageExam();
}
}
'코딩수업 > AWS 클라우드환경 네이티브' 카테고리의 다른 글
8/18 자바(Java) GUI 활용 - 마우스 리스너/모션 리스너와 빙고 만들기 (0) | 2022.08.18 |
---|---|
8/17 자바(Java) GUI 활용 - 체크박스 및 이벤트 활용 (0) | 2022.08.17 |
8/12 자바(Java) super, static, get/set 메소드, 다형성, abstract, 참조 변수의 타입 변환(up-casting / down-casting) (0) | 2022.08.12 |
8/11 자바(Java) 클래스 연습 문제 (숫자 야구 게임 만들기) (0) | 2022.08.11 |
8/10 자바(Java) 클래스 연습 문제 (0) | 2022.08.10 |
댓글