JAVA

23-01-18 수업내용 정리

모건이삼촌 2023. 1. 18. 22:23

2023-01-18 09:30 ~ 18:30 수업진행

 

※ 수업내용

 

★ 복습

 

package chapter07;

import java.util.Arrays;

public class InitEx {
	//arr이라는 이름을 가지는 int타입의 일차원배열을 생성, 10개의 공간으로 초기화, 클래스변수
	
	static int[] arr = new int[10];
	
	
	static {
		
	
	// 2. 10의 공간의 임의의 숫자를 배정해서 초기화 단 0에서 100사이의 5의 배수로 지정
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int)(Math.random()*21)* 5;
			
			}
		}
		
	public static void main(String[] args) {
		new InitEx();
		System.out.println(Arrays.toString(arr));
		new InitEx();
		System.out.println(Arrays.toString(arr));
			
		
		
		
	}

}

실행결과

============================================================================================

9. 패키지

패키지는 폴더(디렉터리)라고 생각하면 쉽게 이해할 수 있다.

자바에서 클래스들을 폴더별로 묶어서 관리하기 위한 단위라고 보면 된다.

원래 클래스의 이름은 패키지명까지 포함된다.

String클래스의 이름은 String이 아니고 java.lang.String이다. 그 클래스의 이름을 식별하기위한 식별자 이기도 하다.

클래스명이 같아도 패키지명이 다르면(다른 폴더에 있으면) 다른 클래스이다.

우리가 한 폴더에 같은 파일명은 보관할 수 없지만, 다른 폴더에는 보관할 수 있는것과 같은 원리이다.

패키지를 상위, 하위로 구분하기 위한 기호는 도트(.)를 사용해서 다음과 같이 표현한다

 

상위패키지.하위패키지.클래스명

 

패키지 선언은 반드시 파일 제일 윗줄에 선언해야 한다.

패키지는 명사형이 대부분이고, 
단어와 단어사이의 규칙이 있는데 한단어로 끝내는게 가장 이상적이며
여러 단어가 들어가는 경우 하위패키지를 생성하면 된다.

 

패키지 이름을 작성하는 규칙

1. 숫자로 시작할 수 없고, _,$외 특수문자 사용불가

2. 관례적으로 소문자로 작성

3. 회사에서는 회사 도메인으로 많이 사용(역순으로 사용)

 

1) import

같은 패키지에 있는 클래스들은 아무 코드없이 객체를 생성하거나 사용할 수 있지만, 다른 패키지에 있는 클래스를 사용하려면 패키지의 이름까지 전부 기술해야 사용할 수 있다.

클래스를 사용하기 위해서 import를 해야한다.

 

패키지중 java.lang은 자동 import이다. import구분을 생략한다

 

 

10. 접근제한자

자바 어플리케이션은 main()메서드가 없는 직접 실행하는 클래스가 아닌, 다른 곳에서 사용되는 클래스로 만들어진다.

라이브러리형태로 사용되는것인데 클래스를 설계할때 다른 아무곳에서나 접근해서 사용할 수 있거나 지정한곳에서만 접근해서 사용 가능할 수 있도록 설계한다.

접근제한자의 종류는 public, protected, default, pravite 네가지 종류가 있지만 주로 public과 pravite를 사용한다.

접근제한자가 붙을수 있는것은 클래스, 메서드, 필드 이다.

프라이빗의 사적법위는 클래스 내부이다.

 

관용정리
클래스 = 퍼블릭
메서드 = 퍼블릭
생성자 = 퍼블릭
필드 = 프라이빗

 

필드를 퍼블릭으로 해야하는경우는 클래스 상수이다. (예.Math.PI)

생성자를 간혹 pravite로 생성하는 이유는 그 생성자를 인스턴스화 시키지 말라는 의미이다.

대표적인 생성자는 Math이다.

 

필드를 대부분 pravite으로 하는 이유는 다른값이 들어오지 않게 하기 위함이며

pravite는 필드의 기본이다.

캡슐화를 담당하고있는 키워드와 밀접하다
접근을 제한한 필드에 접근하려면 메서드를 통해 우회접근을 해야한다. (getter, setter(this키워드와 함께 사용) / is는 boolean타입일때 해야함)

 

★ 상속

1. 클래스 상속

이미 만들어져 있는 클래스로 상속해주는 클래스를 부모클래스, 또는 상위클래스 라고 부른다.

반대로 부모클래스로부터 기존 변수나 메서드들을 그대로 물려받는 즉, 상속을 받는 클래스를 자식클래스 또는 하위클래스라고 부른다.

 

자바에서는 자식이 부모를 선택하게 된다.

자식클래스들에 공통된 부분이 있으면 공통된 부분에서 중복해서 만들지 않기 위해서 부모클래스를 만들어서 작성하는 것이므로 자식클래스들이 부모를 생성하는 방식이라서 자식이 부모를 선택한다

자바에서 상속을 정의할 때 extends라는 키워드를 사용한다. 

class 자식클래스 extends 부모클래스 {

}

상속의 특징

1. 단일상속만 가능 - 자식클래스는 하나의 부모클래스에서만 상속 받을수 있다.

2. 자식 클래스를 객체로 생성할 때, 부모 클래스가 먼저 객체화 된다.

3. 모든 클래스는 Object클래스로 부터 시작하는 상속관계의 하위 객체이다

   (모든 클래스의 가장 상위클래스는 Object클래스 이다.

 

아래 예제를 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package chapter8;
 
public class Phone { // 조상
    
    String name;
    String color;
    String company;
    
    void call() {
        System.out.println("전화를 건다");
    }
    void receive() {
        System.out.println("전화를 받다");
    }
    
 
}
 
cs
1
2
3
4
5
6
7
8
9
10
11
package chapter8;
 
public class SmartPhone extends Phone {
    
    public void installApp() {
        System.out.println("앱 설치");
    }
    
 
}
 
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
package chapter8;
 
public class SmartPhoneMain {
    
    public static void main(String[] args) {
        
        Phone p = new Phone();
        p.name = "전화기";
        p.company = "현대";
        p.color = "화이트";
        
        System.out.println("Phone 출력");
        System.out.println(p.name);
        System.out.println(p.company);
        System.out.println(p.color);
        p.call();
        p.receive();
        
        SmartPhone sp = new SmartPhone();
        sp.name = "갤럭시";
        sp.company = "삼성";
        sp.color = "블랙";
        
        
        System.out.println("SmartPhone 출력");
        System.out.println(sp.name);
        System.out.println(sp.company);
        System.out.println(sp.color);
        sp.call();
        sp.receive();
        sp.installApp();
        
    }
 
}
cs

실행 결과

phone 클래스는 name, company, color 세개의 변수와 call(), receive() 메서드 두개를 가지고 있다.

메서드는 출력만 하는 단순한 기능으로 정의되어 있다.

SmartPhone 클래스는 클래스명에 SmartPhone extends Phone 라고 정의되어 있다. Phone 클래스를 상속받는다는 의미이다.

SmartPhone클래스는 installApp()이라는 메서드 하나 밖에 없지만 실제로는 Phone클래스에 있는 name, company, color,call(), receive() 5가지의 구성요소와 추가로 installApp()까지 가지고 있는것이다.

SmartPhone이라는 클래스는 이 두 클래스를 객체로 생성하고 있다.

p라는 Phone클래스를 객체로 생성해서 name, company, color변수에 값을 대입했고 p객체의 변수를 출력하고, p객체의 메서드를 실행했다

다음은 SmartPhone클래스의 객체를 sp변수에 생성하고 마찬가지고 변수의 각각 값을 대입, 출력후 메서드를 실행했다.

SmartPhone 클래스는 installApp()메서드 밖에 없었지만 phone 클래스에 있던 모든 변수와 메서드는 그대로 전부 사용할수 있다.

 

2) super

super는 자식 객체에서 부모 객체를 가리키는 참조변수이다.

super는 this와 비슷하다.

 

super.변수명;

super.메서드명();

위 형태로 부모객체의 변수와 메서드를 사용하게 된다.

super를 사용하게 되면 자신이 속한 클래스에서 찾지않고 상위 클래스에서만 멤버를 찾게된다.

super()는 괄호가 붙어서 메서드처럼 사용하고, 부모 객체의 생성자를 실행할 때 사용한다.

this와 super 모두 static메서드에서는 사용할 수 없다.

 

3) super()

super라는 키워드에 메서드처럼 ()가 붙어 있는데, 바로 부모 객체의 생성자를 의미한다. 이 super()로 부모 객체의 생성자를 실행할 수 잇는데, 아래 예제와 같이 부모 클래스의 생성자에 매개변수가 있는경우 자식클래스의 생성자에서 반드시 super()로 부모생성자를 실행해줘야 한다.

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 Ex;
 
public class SuperEx2 {
    
 
}
 
class Parent2 {
    
    String name;
//    public Parent2() {
//        
//    }
    Parent2(String name) {
        this.name = name;
        
    }
}
 
class Child2 extends Parent2 { // 에러발생
    public Child2() {
        // TODO Auto-generated constructor stub
        super(null); // 생성자 실행시 에러 사라짐
    }
}
 
cs

super()를 끝으로 23-01-17 수업내용 정리를 마치겠다.