Java

[Java] 객체 지향 클래스 ( static 변수 / java document / final 키워드 / identifier(변수의 명명규칙, 관습적 명명법) / 윈도우 창 만들기)

소댓 2023. 3. 17. 12:28

* Static 변수

 

- static 변수는 지정하지 않아도 기본값 0이 출력됨

> no가 static 변수이기 때문에 지정하지 않아도 
  static과 함께 no의 기본값 0 출력됨
  System.out.println(Test.no);

- static method인 show도 바로 실행 가능
  Test.show();

> no2는 일반 변수이기 때문에 지정 안하면 실행 불가능
   System.out.println(Test.no2);
> 따라서, 인스턴스화 해야 실행 가능
  Test t = new test();

 

static area stack heap
no : 0



show()
t : #100 #100
no2
show2()

 

 

* Test > no 변수

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package day12;
 
public class Test {
 
    static int no; // static 변수
    int no2;
    
    static {
        System.out.println("static block이 실행됨");
        int a = 10;
        System.out.println("a : "+a);
    }
    
    Test() {
        System.out.println("기본생성자");
    }
    
    public static void show() {
        System.out.println("static method : show()");
    }
    
    public void show2() {
        System.out.println("instance method show2()");
    }
    
}
cs

 

 

* TestMain07 - Test 클래스 확인

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package day12;
 
public class TestMain07 {
    public static void main(String[] args) {
        
        // no가 static 변수이기 때문에 지정하지 않아도 
        // static과 함께 no의 기본값 0 출력됨
        System.out.println(Test.no);
        
        // static method인 show도 바로 실행 가능
        Test.show();
        
        // no2는 일반 변수이기 때문에 지정 안하면 실행 불가능
//        System.out.println(Test.no2);
        // 따라서, 인스턴스 만들고 실행 가능
        Test t = new Test();
        System.out.println(t.no2);
        t.show2();
        
    }
    
    
}
cs

 

 


 

* Java document

 

- api document 확인하는 방법
  1. 웹사이트
  2. 다운받아놓고 html
  Java Conceptual Diagram > Java SE API
  docs > api > index html
  object : 모든 클래스의 조상 (모든 클래스에 extends Object가 생략)
  생성자 하나에 11개의 메서드

  원래는 System.out.println도 java.lang.system을 import 해야하지만
  lang은 워낙 많이 쓰이기 때문에
  import java.lang.*; 이 부분은 자동 선언

 

 

* final 키워드

- final class : 마지막 클래스, 상속 금지

- final 변수 : 마지막 변수 ==> 상수

- final 메서드 : method override 금지  >   조선 : 경국대전

 

 

* Frame, Arrays, Scanner 메서드(개발자들이 만들어 놓은 메서드) test

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package day12;
// import java.lang.*; 이 부분은 자동 선언
import java.awt.Frame;
import java.util.Arrays;
import java.util.Scanner;
 
public class TestMain01 {
    public static void main(String[] args) {
            
    // window 창 만드는 클래스 : Frame > import 필요!
    Frame f = new Frame();
    
    // 화면에 보이게 > 이런 걸 알려면 api 문서 확인해야
    f.setVisible(true);
    
    // 버블 소트 --> 개발자들이 만들어놓은 메서드 활용
    int[] m = { 1293261832 };
    
    Arrays.sort(m); // -> static method라서 new 없이도 사용 가능
    
    
    System.out.println(Arrays.toString(m));
    Math.random(); // import 안하기 때문에 java.lang 패키지에 있는 것!
    
    // api document 확인하는 방법
    // 1. 웹사이트
    // 2. 다운받아놓고 html
    // Java Conceptual Diagram > Java SE API
    // docs > api > index html
    // object : 모든 클래스의 조상 (모든 클래스에 extends Object가 생략)
    // 생성자 하나에 11개의 메서드
    
    // 원래는 System.out.println도 java.lang.system을 import 해야하지만
    // lang은 워낙 많이 쓰이기 때문에
    // import java.lang.*; 이 부분은 자동 선언
    
    
    Scanner sc = new Scanner(System.in);
    sc.nextInt();
    
    // Scanner
    
    // sc.nextInt(); <-- java.util
    
    
    }
}
 
cs

 

 


 

< 윈도우 창 만들기 >

 

* AWT(Abstract Window Toolkit)
- Component : 부품
- Container : 컴포넌트를 담는 컴포넌트

 

* 컴포넌트 배치
 1. 배치관리자 (Layout Manager) : 모든 컨테이너는 기본 배치관리자가 존재 > Frame : BorderLayout
 2. 수동으로 직접 배치

 

 

* TestMain02 > Frame 메서드 활용

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package day12;
 
import java.awt.Frame;
 
public class TestMain02 {
    public static void main(String[] args) {
        // 프레임 객체 생성
        Frame f = new Frame();
        
        // 창의 크기 지정
        f.setSize(400300); // 너비 400 높이 300
        
        f.setLocation(500300); // 너비 500, 높이 300 위치에 창을 지정
        
        // 화면에 보이기
        f.setVisible(true);
        
        
    }
}
 
cs

 

 

* 윈도우 창에 버튼 만들기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package day12;
 
import java.awt.Button;
import java.awt.Frame;
 
// AWT(Abstract Window Toolkit)
// Component : 부품
// Container : 컴포넌트를 담는 컴포넌트
 
// A is a B : 상속     -> 토끼는 포유류
// 경찰은 총이다. XXX
// 경찰은 총을 가지고 있다.
// A Has a B : 포함
// window창은 버튼을 가지고 있어야 하기 때문에, 멤버 변수!
 
public class MyWin01 extends Frame{
    // Frame 자신의 메서드, 조상들의 메서드...
    
    Button btn; // ctrl+shift+o
    String name;
    
    MyWin01() {
        // 기본 생성자 첫 라인에는 super(); 가 생략된 것
        super(); // -> Frame 기본 생성자를 호출 
        // 부모를 상속받았기 때문에 부모의 생성자를 상속 받는 것
        System.out.println("MyWin01 기본생성자 호출");
        
        setTitle("내가 만든 윈도우창 ver 0.01");
        
        // 멤버변수 초기화
        btn = new Button("Click me !!! ");
        
        // 위의 버튼을 사용하려면,
        // Frame이라는 컨테이너를 상속 받은 MyWin01이란느 컨테이너에 버튼이라는 컴포넌트를 부착
        add(btn); 
        // 
        
        setSize(300300);
        
        setLocation(300100);
 
        setVisible(true);
    }
    public static void main(String[] args) {
        MyWin01 mw = new MyWin01();
        
        
    }
}
cs

 

 

* 윈도우에 버튼 5개 만들기 > Button, Frame 메서드와 BorderLayout 활용

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package day12;
 
import java.awt.Button;
import java.awt.Frame;
 
// 창 제목 : Hello Window World!!!
// 창 크기 : 500, 500
// 창 위치 : 300, 300 위치
 
// 동 서 남 북 중앙 > 5개의 버튼을 만들고 현재 윈도우에 부착
 
// 컴포넌트 배치
// 1. 배치관리자 (Layout Manager) : 모든 컨테이너는 기본 배치관리자가 존재 > Frame : BorderLayout
// 2. 수동으로 직접 배치
 
public class MyWin02 extends Frame {
    
    Button btnEast, btnWest, btnSouth, btnNorth, btnCenter;
    String name; // 위랑 비교 용도로만 적어둠...
    
    MyWin02() {
        super(); // Frame의 기본 생성자(윈도우 창이 생성만 되는 정도)
    
        // 생성자에서 멤버변수 초기화 필요
        // 생성자의 목적 : 객체(멤버변수)의 초기화
        btnEast = new Button("EAST");  // =this.btnEast; > 생략
        btnWest = new Button("WEST");
        btnSouth = new Button("SOUTH");
        btnNorth = new Button("NORTH");
        btnCenter = new Button("CENTER");
        
        //화면에 버튼 부착
        // BorderLayout으로 배치 조정 가능
        add(btnEast, "East"); // =this.add(btnEast); > 생략
        add(btnWest, "West");
        add(btnSouth, "South");
        add(btnNorth, "North");
        add(btnCenter, "Center");
        // 위치를 생략하면 정중앙에 배정 - Center
        
        setTitle("Hello Window World!!!");
        setSize(500,  500);
        setLocation(300300);
        setVisible(true);
 
    }
 
    
    public static void main(String[] args) {
        MyWin02 mw = new MyWin02();
        
    }
 
}
cs

 

 


 

* identifier

- idenfifier : 식별자

- 변수 > 무언가의 이름을 나타냄

 

* 변수의 이름 명명규칙

 1. 대소문자 구분되며 길이의 제한이 없다.

 2. 예약어를 사용할 수 없다. 

 3. 숫자로 시작할 수 없다. 100 dollar xxx

 4. 특수문자 x . .단 _, $는 가능

 >> 자바 : 한글로 클래스명 사용 가능

 

 

* 관습적 명명법

- 변수명

1. 첫글자는 소문자 : value

2. 2개 이상의 단어는 뒷단어의 첫글자를 대문자로 : max value ==> maxValue

 

- 메서드명 : ()

1. ()가 들어간다.

2. 첫글자는 소문자 나머지도 소문자

3. 2개 이상의 단어는 뒷단어 첫글자를 대문자 : getName() <== get name

 

- 클래스명

1. 첫글자는 대문자 나머지는 소문자 : Guest

2. 2개 이상의 단어는 뒷단어 첫글자를 대문자 : GuestObject

 

- 생성자

1. ()가 들어간다.

2. 첫글자는 대문자 나머지는 소문자 : Guest()

3. 2개 이상의 단어는 뒷단어 첫글자를 대문자 : GuestObject()

 

 

(예시)

1. BigData() > 생성자

2. setTime() > 메서드

3. companyName > 변수

4. SMALL_VALUE > 상수

5. Human > 클래스

6. getHour() > 메서드

7. minData() > 메서드

8. TestData > 클래스

 

 


* cmd로 java 테스트

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package day12;
 
public class TestMain06 {
    // 메인 메서드의 스트링 배열을 매개 변수로 사용
    
    // run as - run configurations - arguments에서 값 추가
    // cmd에서 확인 > 테스트할 경우에 사용
    public static void main(String[] args) {
        System.out.println("args[0] : "+args[0]);
        System.out.println("args[1] : "+args[1]);
    } 
    
}
 
cs

 

 

* cmd

 

C:\WINDOWS\system32>cd c:\

c:\>dir TestMain06.java
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: 585B-C433

 c:\ 디렉터리

2023-03-17  오전 09:10               190 TestMain06.java
               1개 파일                 190 바이트
               0개 디렉터리  92,811,075,584 바이트 남음


c:\>javac TestMain06.java

c:\>java TestMain06 사과 배
args[0] : 사과
args[1] : 배

c:\>copy TestMain06.java Test.java
        1개 파일이 복사되었습니다.

c:\>java TestMain06 -Dev -c
args[0] : -Dev
args[1] : -c

 

 

 

더보기

[ 응용 ]

 

 

1. Animal 클래스를 작성한다.

 

조건1 : 멤버변수 name, age

조건2: eating(String name) : name을 먹어요 메세지 출력

sleeping() :

package day12;

public class Animal {

	String name;
	int age;
	
	Animal() {
		
	}
	
	public void eating(String name) {
		this.name = name;
		System.out.println(name+"을 먹어요");
	}
	
	public void sleeping() {
	}

		
	}
 

 

 

2. Animal 클래스를 상속받은 Cat 클래스를 작성

 

조건1 : 멤버변수 : kind

조건2: eating, sleeping 메서드를 Override

package day12;
// Animal 클래스 상속 받은 Cat 클래스

public class Cat extends Animal{

	String kind;
	
	Cat(){
		name = "야옹이";
		kind = "코숏";
		age = 3;
	}
	
	@Override
	public void eating (String name) {
		System.out.println(name+"얌얌");
	}
	
	@Override
	public void sleeping () {
		System.out.println("Zzz");
	}
	
}
 

 

 

3. Animal 클래스를 상속받은 Dog 클래스를 작성

 

조건1 : 멤버변수 : kind

조건2 : eating, sleeping 메서드를 Override

 

package day12;

public class Dog extends Animal {

	String kind;
	
	Dog(){
		name = "멍뭉이";
		kind = "믹스";
		age = 5;
	}
	
	@Override
	public void eating (String name) {
		System.out.println(name+"냠냠쩝쩝");
	}
	
	@Override
	public void sleeping () {
		System.out.println("크어어..");
	}
	
}
 

 

 

4 main method를 만들고 다음 코드를 실행시켜보세요

 

Cat c = new Cat();

System.out.println(c.kind);

c.eating("생선");

c.sleeping();

 

Dog d = new Dog();

System.out.println(d.kind);

d.eating("뼈다귀");

d.sleeping();

 

package day12;

public class TestAnimal {

	public static void main(String[] args) {
		// cat의 인스턴스화
		Cat c = new Cat();
		
		System.out.println(c.kind);
		
		c.eating("생선");
		c.sleeping();
		
		System.out.println("-------------------");
		
		// dog의 인스턴스화
		Dog d = new Dog();
		
		System.out.println(d.kind);
		
		d.eating("뼈다귀");
		d.sleeping();
		
	}
	
}
 

 

5. 삼각형 , 사각형 , 원 클래스의 부모 클래스 (도형클래스) 를 작성하고

다른 클래스는 이 클래스를 상속받도록 수정하세요

 

package day12;

public class Figure {

	int width, height, r;
	
}
 
package day12;

public class Triangle extends Figure {

	
	// 전역변수
//	int width, height; // Figure 상속 받으면서 생략
	
	// 멤버메서드
	void getCalArea(int width, int height) {
		System.out.println((width * height)/2);
	}
	
	 // setter
 	public void setheight(int height) {
         this.width = height;
     }
 	
 	// getter
     public int getheight() {
         return this.height;
     }
    
}
 
package day12;

public class Rectangle extends Figure {
	// 전역변수
//	int width, height; // Figure 상속 받으면서 생략
	
	// 멤버메서드
	void getCalArea(int width, int height) {
		System.out.println(width * height);
	}
	
	// setter
	public void setwidth(int width) {
        this.width = width;
    }
	
	// getter
    public int getwidth() {
        return this.width;
    }
    
 // setter
 	public void setheight(int height) {
         this.width = height;
     }
 	
 	// getter
     public int getheight() {
         return this.height;
     }
    
}
 
package day12;

public class Circle extends Figure {

	// 전역변수
//	int r; // Figure 상속 받으면서 생략
	
	// 멤버 메서드
	void getCalArea(int r) {
		System.out.println(r*r*Math.PI);
	}
	
	// setter
	public void setr(int r) {
        this.r = r;
    }
	
	// getter
    public int getr() {
        return this.r;
    }
}
 

 

6. 아래코드가 수행될수있도록 Friend 클래스를 작성하세요

 

public class Q06 {

public static void main(String[] args) {

Friend f1 = new Friend("둘리",8,"백수");

Friend f2 = new Friend("홍길동",20,"도적");

 

f1.showInfo(); // 둘리는 8살이며 백수입니다.

f1.showName(); // 이름 : 둘리

 

f2.showInfo(); // 홍길동은 20살이며 도적입니다.

f2.showName(); // 이름 : 홍길동

}

}

 

 

7. Friend 클래스는 Man 클래스를 상속해서 작성한 클래스입니다. Man 클래스를 작성하고 Friend 클래스를 수정하세요

 

Man 클래스

int age

String name

public void showInfo()

 

 

package day12;
// Man을 상속받은 Friend 클래스
// age, name, showInfo() 상속 받음
public class Friend extends Man {

	// 전역 변수
	// 상속 받으면서 생략
//	String name, job;
//	int age;
	
	String job;
	
	Friend() {
	
	}
	
	// 참조값 받을 수 있도록.. this 사용
	Friend(String name, int age, String job) {
		this.name = name;
		this.age = age;
		this.job = job;
	}
	
	// 멤버 메서드
	
	// Man의 showInfo 상속받음
	@Override
	public void showInfo() {
		System.out.println(name+"는 "+age+"살이며 "+job+"입니다");
	}
	
	public void showName() {
		System.out.println("이름 : "+name);
	}
	
}
 

 

 

8. Man 클래스를 상속받은 OfficeWorker 클래스를 작성하세요

 

( 단 showInfo() 는 Override method )

 

public class Q08 {

public static void main(String[] args) {

 

 

OfficeWorker ow1 = new OfficeWorker("고길동",50,"과장","서울")

ow1.showInfo(); // 고길동, 50살, 과장, 서울거주

ow1.getAddrs(); // 서울

}

}

 

package day12;
// Man을 상속 받는 OfficeWorker 클래스
public class OfficeWorker extends Man {

	String job, address;
	
	OfficeWorker(){
		
	}
	
	OfficeWorker(String name, int age, String job, String address) {
		this.name = name;
		this.age = age;
		this.job = job;
		this.address = address;
	}
	
	@Override
	public void showInfo(){
		System.out.println(name+", "+age+"살, "+job+", "+address+"거주");
	}
	
	public void getAddrs(){
		System.out.println(address);
	}
	
	
}
 

 

 

9. Man 클래스를 추상 클래스로 수정하고 showInfo() method를 추상메서드로 변경하세요

 

package day12;
// Man을 추상화 클래스로 변경
public abstract class Man {

	int age;
	String name;
	
	// 추상화 메서드로 변경
	public abstract void showInfo();
	
}
 

 

10. this, this(), super, super() 무엇인가?

 

- this : 나 자신을 가리키는 참조변수

- this() : 내 클래스의 기본 생성자

- super: 부모를 가리키는 참조변수

- super() : 부모 클래스의 기본 생성자

 

 

11. Computer 객체를 생성할수 있는 클래스를 작성하세요

 

기능 : On(), Off()

 

package day12;

public class Computer {

	Computer() {
		
	}
	
	public void On() {
		System.out.println("켜지는 중입니다.");
	}
	
	public void Off() {
		System.out.println("전원이 꺼집니다.");
	}
}
 

 

12. Computer 객체를 상속받는 PDA 클래스를 작성하세요

 

 

PDA p = new PDA();

 

p.On(); // 켜지는중입니다.

p.call("010-1234-5678"); // 010-1234-5678 번으로 전화 거는중

p.connect(); // 연결중입니다.

p.useInternet(); // Internet 사용중입니다. \

 

package day12;

public class PDA extends Computer {

	String number;
	
	PDA(){
		
	}
	
	public void call(String number) {
		System.out.println(number+"번으로 전화 거는 중");
	}
	
	public void connect() {
		System.out.println("연결 중입니다.");
	}

	public void useInternet() {
		System.out.println("Internet 사용중입니다.");
	}
}
 
package day12;

public class TestPDA {
		
	// main method
	public static void main(String[] args) {
		
		// 인스턴스화
		PDA p = new PDA();


		p.On(); // 켜지는중입니다. 

		p.call("010-1234-5678"); // 010-1234-5678 번으로 전화 거는중

		p.connect(); // 연결중입니다. 

		p.useInternet(); // Internet 사용중입니다. 
		
		
	}
}
 

 

 

13. 객체지향언어의 특징 4가지는 ?

 

1. 캡슐화(encapsulation) : 객체의 내부 구조 및 데이터를 캡슐처럼 감싸 외부에서 직접 볼 수 없게 은닉하여 보호하는 것

2. 상속(inheritance) : 어떤 클래스가 가지고 있는 메서드와 변수를 상속해서 다른 클래스가 갖도록 하는 것

3. 추상화(Abstraction) : 공통된 특징을 묶어 하나의 클래스로 정의해 상위의 개념을 만들어 냄

4. 다형성(polymorphism) : 동일한 조작방법으로 동작시키지만 대상에 따라 다른 실행하게 하는 것

 

14. 추상클래스?

 

​아직 정해지지 않은 메서드로, 건물의 조감도 역할을 함

 

 

 

15. 접근지정자의 접근범위가 작은것에서 큰순으로 기술하시요.

 

​private

default

protected

public

 

 

16. 생성자와 일반 메세드의 차이점?

 

생성자는 멤버 변수의 초기화를 목적으로 가지고 있는 특수한 목적의 메서드

일반 메서드와 달리 리턴하지도 않고 리턴 키워드도 없음

void도 사용하지 않으며, 클래스명과 동일한 이름을 갖는다.

 

 

17. 다음 ?? 에 적절한 단어를 채우세요

 

자바에서 상속받는 클래스를 서브 클래스(sub class) 라고 부르며, extends 키워드를

이용하여 상속을 선언한다. 상속받은 클래스에서 상속해준 클래스의 멤버를 접근할 때

super 키워드를 이용한다.

인터페이스는 클래스와 달리 implements 키워드를 이용하여 선언한다.

 

 

18. Barkable 인터페이스를 만들고

 

추상메서드로 barkSound()를 추가

package day12;

// Barkable 인터페이스 생성
public interface Barkable {

	
	// 추상화 메서드 barkSound()
	public abstract void barkSound();
	
}
 

 

 

19. Barkable 인터페이스를 구현한 Cat, Dog를 완성하세요

 

package day12;
// Animal 클래스 상속 받은 Cat 클래스

public class Cat2 extends Animal implements Barkable{

	String kind;
	
	Cat2(){
		name = "야옹이";
		kind = "코숏";
		age = 3;
	}
	
	@Override
	public void eating (String name) {
		System.out.println(name+"얌얌");
	}
	
	@Override
	public void sleeping () {
		System.out.println("Zzz");
	}

	@Override
	public void barkSound() {
		System.out.println("야오옹");
		
	}
	
}
 

 

package day12;

public class Dog2 extends Animal implements Barkable {

	String kind;
	
	Dog2(){
		name = "멍뭉이";
		kind = "믹스";
		age = 5;
	}
	
	@Override
	public void eating (String name) {
		System.out.println(name+"냠냠쩝쩝");
	}
	
	@Override
	public void sleeping () {
		System.out.println("크어어..");
	}

	@Override
	public void barkSound() {
		System.out.println("멍멍!");
		
	}
	
}