final
abstract + class 상속을 받게할 목적 final + class 상속을 받지 못하게 함
abstract + method 오버라이딩 하게끔 final + method 오버라이드 못 함
final + variable 값 할당 못하게 함
package day17;
class Super{
void foo() {
System.out.println("Super's foo()");
}
final void bar() {
System.out.println("Super's bar()");
}
}
class Sub extends Super{
int x = 100;
final int y = 200;
@Override
protected void foo() {
System.out.println("Sub's foo()");
}
// public void bar() {
// final 메소드는 재정의 불가
// }
}
public class TestFinal {
public static void main(String[] args) {
//Sub x,y값 출력하기
//foo() bar()호출해보기
Sub sc = new Sub();
sc.x=10;
// sc.y=20; final 변수는 값 할당 불가
System.out.println(sc.x);
System.out.println(sc.y);
sc.foo();
sc.bar();
}
}
interface
final 변수와 추상 메소드로만 구성됨
interface는 다중 상속이 가능하다.
인터페이스를 상속받으면 반드시 추상메소드를 오버라이딩 해야한다.
인터페이스는 타입 선언은 가능하나 객체 생성은 불가능하다.
인터페이스가 인터페이스를 상속 받을 때는 extends라는 키워드를 사용하며 여러 개의 인터페이스를 상속받는 것이 가능하다.
클래스가 인터페이스를 상속받을 때는 implements로 상속받으며 다중 상속이 가능하다.
package day17;
//인터페이스 = final인 상수 + 추상메소드로만 구성
interface MyInter {
void sub();
}/////////////
interface YourInter{
String STR="Hello";
//변수앞에는 자동으로 public static final이 붙는다.
String bar();
//자동으로 public 과 abstract가 붙는다.
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
package day17;
public class MyDemo implements MyInter, YourInter{
@Override
public void sub() {
System.out.println("sub()");
}
@Override
public String bar() {
return "bar()";
}
public static void main(String[] args) {
MyDemo md = new MyDemo();
md.sub();
System.out.println(md.bar());
System.out.println(MyDemo.STR);
MyInter mi =new MyDemo();
mi.sub();
System.out.println(((MyDemo)mi).bar());
YourInter yi = new MyDemo();
((MyDemo)yi).sub();
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
package day17;
interface Inter1{
void a();
void b();
}
interface Inter2 extends Inter1{
int X=55;
}
interface Inter3{
String c();
}
abstract class Absclass{
abstract public void test();
}
public class MyClass extends Absclass implements Inter2, Inter3{
@Override
public void a() {
System.out.println("a()");
}
@Override
public void b() {
}
@Override
public String c() {
return "c()";
}
@Override
public void test() {
System.out.println("test()");
}
public static void main(String[] args) {
MyClass mc = new MyClass();
mc.a();
mc.c();
mc.test();
System.out.println(MyClass.X);
Inter2 i2 = new MyClass();
i2.a();
System.out.println(((MyClass)i2).c());
((MyClass)i2).test();
Absclass ac = new MyClass();
((MyClass)ac).a();
System.out.println(((MyClass)ac).c());
ac.test();
}
}
Event
프로그램과 관련있는 사건
이벤트 처리를 위한 기본 개념
1) Event Source
Event를 발생시키는 근원지 컴포넌트나 컨테이너가 이벤트 소스가 된다.
2) Event
Event 소스에 따라 발생되는 Event가 달라진다.
3) Event Handler
Event를 처리해주는 클래스를 의미한다.
프로그래머가 직접 구현해주어야 하는 클래스이다.
이벤트 핸들러가 되기 위해서는 XXXListener란 인터페이스를 상속받아야한다.
이벤트 핸들러 구현방법
1- 이벤트 소스를 가진 클래스가 이벤트 핸들러가 되는 방법
2- 이너 클래스로 이벤트 핸들러를 구현하는 방법
3- 별개의 외부 클래스로 이벤트 핸들러를 구현하는 방법
package day17;
import javax.swing.*;
import java.awt.*;
import day16.MyJPanel;
import java.awt.event.*;//1
//2 xxxListener 인터페이스를 상속받자
public class MyButtonEvent extends JFrame implements ActionListener{//2
JPanel rootP, northP;
JButton b1,b2,b3,b4;
ImageIcon icon1, icon2, icon3, icon4;
public MyButtonEvent(){
super("::MyButtonEvent::");
Container cp = this.getContentPane();//BorderLayout
rootP = new JPanel();//FlowLayout
northP = new MyJPanel();
northP.setLayout(new GridLayout(1,4,10,10));
northP.setBackground(Color.white);
cp.add(rootP,"Center");
cp.add(northP,"North");
rootP.setBackground(Color.white);
icon1=new ImageIcon("images/11.PNG");
icon2=new ImageIcon("images/22.PNG");
icon3=new ImageIcon("images/33.PNG");
icon4=new ImageIcon("images/44.PNG");
b1=new JButton("Red",icon1);
b2=new JButton("Green",icon2);
b3=new JButton("Blue",icon3);
b4=new JButton("Exit",icon4);
this.setCenterTop(b1);
this.setCenterTop(b2);
this.setCenterTop(b3);
this.setCenterTop(b4);
northP.add(b1);
northP.add(b2);
northP.add(b3);
northP.add(b4);
//4 이벤트 소스에 리스너 부착
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
b4.addActionListener(this);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
String cmd =e.getActionCommand();
setTitle(cmd+"버튼을 눌렀다");
Object obj = e.getSource();
if(e.getActionCommand()=="Red") {
rootP.setBackground(Color.red);//5
}
else if(obj==b3) {
rootP.setBackground(Color.blue);//5
}
else if(e.getActionCommand()=="Green") {
rootP.setBackground(Color.green);//5
}else if(obj==b4) {
System.exit(0); //정상종료이면 0을 넘기고 비정상 종료일 경우는 0이 아닌 값을 넘긴다.
}
}
public void setCenterTop(JButton bt) {
bt.setHorizontalTextPosition(JButton.CENTER);
bt.setVerticalTextPosition(JButton.TOP);
}
public static void main(String[] args) {
MyButtonEvent my = new MyButtonEvent();
my.setSize(500,500);
my.setVisible(true);
}
}
Button과 관련한 ActionEvent를 처리하는 이벤트 핸들러 구현하기
1) import java.awt.event.*;
2) ActionListener 인터페이스를 상속 받는다.
3) ActionListener 인터페이스의 추상메소드를 오버라이딩 한다(일단 빈블럭으로 구현)
public void actionPerformed(ActionEvent e){ };
4) 이벤트 소스(Button)에 addActionListener()를 이용해서 리스너를 부착한다.
b1.addActionListener(이벤트 핸들러 객체)
5) 3번에서 오버라이딩한 메소드에 이벤트 처리 코드를 구현한다.
생성자가 아닌 곳에서 종료
System.exit(0);
Event 실습
package day17;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import day16.*;
public class MySearchEngine extends JFrame implements ActionListener{
JPanel p1;
JButton b1,b2,b3,b4;
public MySearchEngine() {
super("::MySearchEngine::");
Container cp = this.getContentPane();
p1 = new MyJPanel();
p1.setLayout(new GridLayout(2,2,10,10));
p1.setBackground(Color.white);
cp.add(p1);
b1= new JButton("Naver");
b2= new JButton("Chrome");
b3= new JButton("Daum");
b4= new JButton("Exit");
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
b4.addActionListener(this);
p1.add(b1);
p1.add(b2);
p1.add(b3);
p1.add(b4);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
MySearchEngine t = new MySearchEngine();
t.setSize(500,500);
t.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
Color a= new JButton().getBackground();
Color c= ((JButton)obj).getBackground();
if(obj==b1) {
if(c==a) {
b1.setBackground(Color.green);
}else {
b1.setBackground(new JButton().getBackground());
}
}else if(obj==b2) {
if(c==a) {
b2.setBackground(Color.yellow);
}else {
b2.setBackground(new JButton().getBackground());
}
}else if(obj==b3) {
if(c==a) {
b3.setBackground(Color.pink);
}else {
b3.setBackground(new JButton().getBackground());
}
}else if(obj==b4) {
if(c==a) {
b4.setBackground(Color.gray);
}else {
b4.setBackground(new JButton().getBackground());
}
}
}
}
생성자 밖에서 적용
p1.validate()를 하면 생성자 밖에서 적용된다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
NULL값
null값 체크
is null
null이 아닌 것
is not null
--Null값 여부 체그
select empno, ename, job, sal, comm from emp
where comm is null;
--order by 절
--자료를 정렬하여 나타내고자 할 때 asc default; desc 내림차순
select empno, ename, hiredate from emp
order by hiredate;
select empno, ename, hiredate from emp
order by hiredate desc, empno asc;
--다양한 정렬 방법
select empno, ename, sal, sal*12+NVL(comm,0) as 연봉 from emp
order by 연봉 desc;
--index 4로도 연봉순으로 정렬이 가능하다.
select empno, ename, sal, sal*12+NVL(comm,0) as 연봉 from emp
order by 4 desc;
--부서번호로 정렬 다음 급여 많은 순
select deptno, empno, ename, sal, job from emp
order by deptno asc, sal desc;
--판매가격이 저렴한 순
select products_name, output_price, input_price from products
order by output_price asc;
--이름 가나다 다음 나이 많은 순
select * from member
order by name asc, age desc;
--사원 테이블에서 81년 2월 20일과 81년 5월 1일 사이 입사한
--사원의 이름, 업무 입사일을 출력 입사일 오름차순
select ename, hiredate from emp
where hiredate between '81/02/20' and '81/05/01'
order by ename;
--사원 테이블에서 보너스가 급여보다 10%가 더 많은 사원의 모든 정보를 출력하세요
select * from emp
where nvl(comm,0) >= (sal*0.1);
--사원 테이블에서 업무가CLARK 이거나 ANALYST이고 급여가 1000,3000,5000이
--아닌 사원의 모든 정보를 출력하세요
select * from emp
where (job='CLERK' or job='ANALYST' )and sal not in (1000,3000,5000);
--사원 테이블에서 이름에 L이 연이어 두자가 있고 부서가 30번이거나
--또는 관리자가 7782번인 사원의 모든 정보
select * from emp
where ename like '%LL%' and( deptno=30 or mgr=7782);
SQL 순서 (WGHO)
where, group by, having, order by
'개발자 > 국비지원 SW' 카테고리의 다른 글
국비지원 19일차 - 예외처리 throws, 사용자 정의 예외 클래스, JMenu, 숫자형 함수, 날짜 함수 (0) | 2020.05.11 |
---|---|
국비지원 18일차 - 예외 처리, try catch, template 만들기, oracle함수, dual 테이블, 문자형 함수 (0) | 2020.05.08 |
국비지원 16일차 - 추상클래스, JFrame, SQL (연산자, LIKE) (0) | 2020.05.06 |
국비지원 15일차 - 패키지, 접근 지정자, 패키징, BorderLayout, GridLayout, Panel상속, SQL, NULL은 0 (0) | 2020.05.04 |
국비지원 14일차 - @Override, instanceof, GUI실습2, Layout, Foreign Key (0) | 2020.04.29 |