728x90
반응형
SMALL

예외와 예외 클래스

에러(Error) : 컴퓨터 하드웨어의 고장으로 인해 응용프로그램 실행 오류가 발생하는 것

예외(Exception) : 잘못된 사용 또는 코딩으로 인한 오류

 

예외의 종류

* 일반 예외(Exception) : 컴파일러가 예외 처리 코드 여부를 검사하는 예외를 말한다.

* 실행 예외(Runtime Exception) : 컴파일러가 예외 처리 코드 여부를 검사하지 않는 예외를 말한다.

 

예외 처리 코드

예외 처리 코드는 try-catch-finally 블록으로 구성된다.

try{
	//예외 발생 가능 코드
} catch{
	//예외 처리
} finally{
	//항상 실행;
}

1) try 블록에서 작성한 코드가 예외 없이 정상 실행되면 catch 블록은 실행되지 않는다.

2) try 블록에서 예외가 발생하면 catch 블록이 실행된다.

3) finally 블록은 예외 발생 여부와 상관없이 항상 실행된다.

 

package ch11.sec02.exam01;


public class ExceptionHandlingExampl2 {
	public static void printLength(String data) {
		try{
			int result= data.length();
			System.out.println("문자 수 : "+result);
		}catch (NullPointerException e) {
			System.out.println(e.getMessage());
		}finally {
			System.out.println("[마무리 실행]\n");
		}
		
	}
	
	public static void main(String[] args) {
		System.out.println("[프로그램 시작]\n");
		printLength("ThisIsJava");
		printLength(null);
		System.out.println("[프로그램 종료]");
	}
}

 

예외 종류에 따른 처리

다양한 종류의 예외는 다중 catch를 사용하면 예외에 따라 다르게 작성할 수 있다.

try{

	ArrayIndexOutOfBoundsException 발생 //예외 발생1
    
   	NumberFormatException 발생 //예외 발생2
    
} catch(ArrayIndexOutOfBoundsException e){
	//예외 처리1
} catch(NumberFormatException e){
	//예외 처리2
}

*처리해야 할 예외 클래스들이 상속관계일 때 하위 클래스 catch 블록을 먼저 작성하고 상위 클래스 catch 블록을 나중에 작성해야 한다.

 

리소스 자동 닫기

리소스 : 데이터를 제공하는 객체.

리소스를 사용하기 위해 열어야(open)하며, 사용 끝난 후에는 닫아야(close)한다. 리소스 사용 중 예외가 발생될 경우에도 안전하게 닫아야 한다.

FileInputStream fis = null;
try{
	fis = new FileInputStream("file.txt");
    ...
} catch(IOException e){
	...
} finally{
	fis.close();
}

 

리소스 자동 닫는 코드

try() 괄호에 리소스를 여는 코드를 작성하면 try 블록이 정상적으로 실행을 완료했거나 예외가 발생해도 자동으로 리소스의 close() 메소드가 호출된다.

try(FileInputStream fis = new FileInputStream("file.txt")){
	...
}catch(IOException e){
	...
}

복수 개의 리소스를 사용해야 한다면 try() 괄호 안에 세미콜론(;)으로 구분한다.

try(FileInputStream fis = new FileInputStream("file.txt");
	FileInputStream fis2 = new FileInputStream("file2.txt")){
	...
}catch(IOException e){
	...
}

 

예외 떠넘기기

메소드 내부에서 예외가 발생할 때 try-catch 블록으로 예외를 처리하는 것이 기본이지만, 메소드를 호출한 곳으로 예외를 떠넘길 수 있다.

리턴타입 메소드명(매개변수, ...) throws 예외클래스1, 예외클래스2, ... {
	...
}

 

사용자 정의 예외

표준 라이브러리에 존재하지 않으면 직접 예외 ㅋㄹ래스를 정의해서 사용해야 한다.

public class XXXException extends [ Exception | RuntimeException ] {
	public XXXEcveption(){
    	//기본 생성자
    }
    
    public XXXException(String message){
    	super(message);
    }
}

 

예외 발생 시키기

사용자 정의 예외를 직접 코드에서 발생시키려면 throw 키워드와 함께 예외 객체를 제공한다.

//직접 try-catch 블록으로 예외 처리
void method(){
	try{
    	...
        throw new Ecveption("예외메시지");
        ...
    }catch(Exception e){
    	String message = e.getMessage();
    }
}
//메소드를 호출한 곳에서 예외를 처리하도록 throws로 예외 떠넘기기
void method() throws Exception{
	...
    throw new Exception("예외메시지");
    ...
}
728x90
반응형
LIST

'IT > JAVA' 카테고리의 다른 글

[JAVA] #13 제네릭  (0) 2023.04.24
[JAVA] #12 java.base 모듈  (0) 2023.04.20
[JAVA] #10 라이브러리 모듈  (0) 2023.04.18
[JAVA] #9 중첩 선언과 익명 객체  (0) 2023.04.17
[JAVA] #8 인터페이스  (0) 2023.04.14
728x90
반응형
SMALL

라이브러리

라이브러리는 프로그램 개발 시 활용할 수 있는 클래스와 인터페이스들을 모아놓은 것을 말한다.

일반적으로 JAR(압축파일 .jar)형태로 존재한다.=> 클래스와 인터페이스의 바이트코드 파일(~.class)들이 압축되어 있다.

 

ClassPath에 라이브러리를 추가하는 방법

=>라이브러리를 이용하려면 jar파일을 classpath에 추가해야 한다.

 

* 콘솔(명령 프롬프트 또는 터미널)에서 프로그램을 실행할 경우

- java 명령어를 실행할 때 -classpath로 제공

- CLASSPATH 환경 변수에 경로를 추가

 

* 이클립스 프로젝트에서 실행할 경우

- 프로젝트의 Build Path에 추가

 

my_lib 라이브러리 프로젝트 생성

Project name: my_lib
Module: [체크안함] Create module-info.java file (중요)

package pack1;

public class A {
	public void method() {
		System.out.println("A-method");
	}
}
package pack2;

public class B {
	public void method() {
		System.out.println("B-method");
	}
}

my_lib 오른쪽 버튼 -> [Export] 클릭 -> JAR file -> [Next] -> my_lib 체크 -> 폴더 및 이름 지정 -> [Finish]

 

 

my_application_1 프로젝트 생성

[File] -> [New] -> [Java Project] -> 입력 -> [Finish]

my_application_1 오른쪽버튼 -> [Build Path] -> [Libraries] -> [Classpath] -> [Add External JARs] -> jar 추가 -> [Apply]

라이브러리 파일 사용하기

 

콘솔에서 -classpath 옵션 사용

명령 프롬프트에서 현재 경로를 bin디렉토리로 이동하고 Main클래스를 실행하면 에러가 발생한다. my_lib.jar를 인식하지 못했기 때문이다.

=>-classpath로 파일 경로를 추가해서 실행해보면 원하는 결과가 출력된다.

 

모듈

모듈은 패키지 관리 기능까지 포함된 라이브러리이다. 일반 라이브러리는 내부에 포함된 모든 패키지에 외부 프로그램에서의 접근이 가능하지만, 모듈은 패키지를 은닉하여 접근할 수 없게끔 할 수 있다.

모듈은 모듈 기술자(module-info.java)에 의존 모듈을 기술할 수 있어 모듈 간의 의존 관계를 파악할 수 있다.

 

my_module_a, my_module_b 생성

Project name: my_module_a
Module: [체크] Create module-info.java file (중요)
Module name: my_module_a
Project name: my_module_b
Module: [체크] Create module-info.java file (중요)
Module name: my_module_b

my_application_2 생성

[File] -> [New] -> [Java Project] -> 입력 -> [Finish]

Project name: my_application_2
Module: [체크] Create module-info.java file (중요)
Module name: my_application_2

[my_application_2]오른쪽 버튼 -> [Build Path] -> [Configure Build Path] -> [Projects] -> Modulepath에 추가 -> [Apply]

 

패키지 은닉

모듈은 모듈 기술자(module-info.java)에서 exprts 키워드를 사용해 내부 패키지 중 외부에서 사용할 패키지를 지정한다.

exports 되지 않은 패키지는 자동적으로 은닉된다.

 

모듈이 일부 패키지를 은닉하는 이유

* 모듈 사용 방법 통일

- 모듈 외부에서 패키지2와 3을 사용하지 못하도록 막고, 패키지1로 사용 방법을 통일한다.

* 쉬운 수정

- 모듈 성능 향상을 위해 패키지2와 3을 수정하더라도 모듈 사용 방법(패키지1)이 달라지지 않기 때문에 외부에 영향을 주지 않는다.

 

전이 의존

다음과 같이 의존 관계를 변경한다고 가정해보자.

module my_application_2{
	requires my_module_a;
}
module my_module_a{
	exports pack1;
    	requires my_module_b;
}

my_application_2에서 my_module_b에 있는 C 클래스를 사용해야 한다면

"requires transitive my_module_b"를 반드시 추가해야 한다.

module my_module_a{
	exports pack1;
    	requires transitive my_module_b;
}

 

728x90
반응형
LIST

'IT > JAVA' 카테고리의 다른 글

[JAVA] #12 java.base 모듈  (0) 2023.04.20
[JAVA] #11 예외 처리  (0) 2023.04.19
[JAVA] #9 중첩 선언과 익명 객체  (0) 2023.04.17
[JAVA] #8 인터페이스  (0) 2023.04.14
[JAVA] #7 상속  (0) 2023.04.11
728x90
반응형
SMALL

중첩 클래스

중첩 클래스란 클래스 내부에 선언한 클래스

=>클래스의 멤버를 쉽게 사용할 수 있고 외부에는 중첩 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다.

선언 위치에 따른 분류 선언 위치 객체 생성 조건
멤버 클래스 인스턴스
멤버 클래스
class A{
    class B{ ... }
}
A 객체를 생성해야만
B 객체를 생성할 수 있음
정적 
멤버 클래스
class A{
    static class B{ ... }
}
A 객체를 생성하지 않아도
B 객체를 생성할 수 있음
로컬 클래스 class A{
    void method(){
            class B{ ... }
    }
}
method가 실행할 때만
B객체를 생성할 수 있음

중첩 클래스도 하나의 클래스이기 때문에 컴파일하면 바이트코드 파일(.class)이 별도로 생성된다.

파일의 이름은 다음과 같이 결정된다.

A $ B .class (A: 바깥 클래스. B: 멤버 클래스)

A $1 B .class (A: 바깥 클래스. B: 로컬 클래스)

 

인스턴스 멤버 클래스

[public] class A{
	[public | private] class B{
    	...
    }
}

 

인스턴스 멤버 클래스 사용

A a = new A();
A.B b = a.new B();

A.B b = new A().new B();

 

정적 멤버 클래스

[public] class A{
	[public | private] static class B{
    	...
    }
}

 

정적 멤버 클래스 사용

A.B b = new A.B();

 

로컬 클래스

생성자 또는 메소드 내부에서 다음과 같이 선언된 클래스

[public] class A{
	//생성자
	public A(){
    	class B {}
    }
    
    //메소드
    public void method(){
    	class B {}
    }
}

* 로컬 변수를 로컬 클래스에서 사용할 경우 로컬 변수는 final 특성을 갖게 되므로 값을 읽을 수만 있고 수정할 수 없게 된다.

 

바깥 멤버 접근

바깥 클래스의 멤버 접근 제한

구분 바깥 클래스의 사용 가능한 멤버
인스턴스 멤버 클래스 바깥 클래스의 모든 필드와 메소드
정적 멤버 클래스 바깥 클래스의 정적 필드와 정적 메소드

 

바깥 클래스의 객체 접근

바깥클래스이름.this => 바깥객체

 

중첩 인터페이스

중첩 인터페이스는 클래스의 멤버로 선언된 인터페이스를 말한다.

클래스 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 객체를 만들기 위해서이다.

class A{
	[public | private] [static] interface B{
    	//상수 필드
        //추상 메소드
        //디폴트 메소드
        //정적 메소드
    }
}

 

익명 객체

익명(Anonymous)객체는 이름이 없는 객체를 말한다.

익명 객체는 클래스를 상속하거나 인터페이스를 구현해야만 생성할 수 있다.

 

익명 자식 객체

부모클래스를 상속받아 생성.

new 부모생성자(매개값, ...){
	//필드
    //메소드
}

 

익명 구현 객체

인터페이스를 구현해서 생성. 보통 안드로이드와 같은 UI 프로그램에서 이벤트를 처리하는 객체로 많이 사용된다.

new 인터페이스(){
	//필드
    //메소드
}
728x90
반응형
LIST

'IT > JAVA' 카테고리의 다른 글

[JAVA] #11 예외 처리  (0) 2023.04.19
[JAVA] #10 라이브러리 모듈  (0) 2023.04.18
[JAVA] #8 인터페이스  (0) 2023.04.14
[JAVA] #7 상속  (0) 2023.04.11
[JAVA] #6 클래스(Class)-2  (0) 2023.04.10
728x90
반응형
SMALL

인터페이스 역할

인터페이스는 두 객체를 연결하는 역할을 한다.

 

인터페이스와 구현 클래스 선언

인터페이스는 '~.java'형태의 소스 파일로 작성되고 '~.class'형태로 컴파일되기 때문에 물리적 형태는 클래스와 동일하다.

 

인터페이스 선언

interface 인터페이스명 {...} //default 접근 제한
public interface 인터페이스명 {...} //public 접근 제한
public interface 인터페이스명{
	//public 상수 필드
    //public 추상 메소드
    //public 디폴트 메소드
    //public 정적 메소드
    //private 메소드
    //private 정적 메소드
}

 

구현 클래스 선언

public class B implements 인터페이스명{...}

 

변수 선언과 구현 객체 대입

RemoteControl rc;
RemoteControl rc = null;//인터페이스는 참조 타입에 속하므로 null대입 가능
rc = new Television;
rc.turnOn();

 

상수 필드

인터페이스는 public static final 특성을 갖는 불변의 상수 필드를 멤버로 가질 수 있다.

public static final은 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.

[public static final] 타입 상수명 = 값;
public interface RemoteControl{
	int MAX_VOLUME = 10;
    int MIN_VOLUME = 0;
}

 

추상 메소드

인터페이스는 구현 클래스가 재정의해야 하는 public 추상 메소드를 멤버로 가질 수 있다.

중괄호{}가 붙지 말아야 한다.

public abstract를 생략하더라도 컴파일 과정에서 자동으로 붙게 된다.

[public abstract] 리턴타입 메소드명(매개변수, ...);

 

디폴트 메소드

인터페이스에는 완전한 실행코드를 가진 디폴트 메소드를 선언할 수 있다. 추상 메소드는 실행부({})가 없지만 디폴트 메소드는 실행부가 있다.

[public] default 리턴타입 메소드명(매개변수, ...){...}

 

정적 메소드

정적 메소드 선언도 가능하며 객체가 없어도 인터페이스만으로 호출할 수 있다.

[public | private] static 리턴타입 메소드명(매개변수, ...) {...}

 

private 메소드

구분 설명
private 메소드 구현 객체가 필요한 메소드
private 정적 메소드 구현 객체가 필요 없는 메소드

 

다중 인터페이스 구현

구현 객체는 여러 개의 인터페이스를 implements할 수 있다.

public class 구현클래스명 implements 인터페이스A, 인터페이스B{
	//모든 추상 메소드 재정의
}
인터페이스A 변수 = new 구현클래스명(...);
인터페이스B 변수 = new 구현클래스명(...);

 

인터페이스 상속

인터페이스도 다른 인터페이스를 상속할 수 있으며, 클래스와 달리 다중 상속을 허용한다.

extends 키워드 뒤에 인터페이스들을 나열한다.

public interface 자식인터페이스 extends 부모인터페이스1, 부모인터페이스2 {...}
자식인터페이스 변수 = new 구현클래스(...);
부모인터페이스1 변수 = new 구현클래스(...);
부모인터페이스2 변수 = new 구현클래스(...);

 

타입 변환

인터페이스의 타입 변환은 인터페이스와 구현 클래스 간에 발생한다.

인터페이스 변수에 구현 객체를 대입하면 자동 타입 변환된다.

인터페이스 타입을 구현 클래스 타입은 강제 타입 변환이 필요하다.

 

자동 타입 변환

인터페이스 변수 = 구현 객체; //자동 타입 변환

 

강제 타입 변환

구현 클래스 변수 = (구현클래스) 인터페이스 변수; //강제 타입 변환
728x90
반응형
LIST

'IT > JAVA' 카테고리의 다른 글

[JAVA] #10 라이브러리 모듈  (0) 2023.04.18
[JAVA] #9 중첩 선언과 익명 객체  (0) 2023.04.17
[JAVA] #7 상속  (0) 2023.04.11
[JAVA] #6 클래스(Class)-2  (0) 2023.04.10
[JAVA] #6 클래스(Class)-1  (0) 2023.04.10
728x90
반응형
SMALL

상속 개념

상속이란? 부모가 자식에게 물려주는 행위를 말한다.

객체 지향 프로그램에서는 부모 클래스의 필드 및 메소드를 자식 클래스에게 물려줄 수 있다.

public class A{
	int field;
    void method1(){...}
}

public class B extends A{
	String field;
    void method2(){...}
}
B b = new B();
b.field1=10;//상속받은 필드
b.field2=20;
b.method1();//상속받은 메소드
b.method2();

 

클래스 상속

자식은 물려받을 부모를 선택한다. 부모는 1개만 가능!

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

}

 

 

부모 생성자 호출

자식 클래스 변수 = new 자식클래스();
//자식 생성자 선언
public 자식클래스(...){
	super();
    ...
}

//자식 생성자 선언2
public 자식클래스(...){
	super(매개값, ...);
}

 

메소드 재정의

메소드 오버라이딩? 부모 클래스의 모든 메소드가 자식 클래스에 맞게 설계된 것이 아니기 때문에 재정의해서 사용한다.

 

메소드 오버라이딩의 규칙

- 부모 메소드의 선언부(리터 타입, 메소드 이름, 매개변수)와 동일해야한다.

- 접근 제한을 더 강하게 오버라이딩할 수 없다.(public->private)으로 변경 불가

- 새로운 예외를 throws 할 수 없다.

class Parent{
	void method1(){
    	System.out.println("Parent");
    }
    
    void method2(){
    	System.out.println("Parent");
    }
}

class Child extends Parent{
	void method2(){
    	System.out.prinln("Child");
    }
}

class ChildExample{
	public static void main(Strings[] args){
    	Child c = new Child();
        
        c.method1();//Parent의 메소드1
        c.method2();//Child의 메소드2
    }

}

 

부모 메소드 호출

메소드 재정의 시 부모 메소드의 일부만 변경된다 하더라고 자식 메소드도 중복된 내용을 갖고 있어야 한다.

중복된 부분은 super()키워드와 도트(.)연산자를 이용한다.

class Parent{
	public void method(){
    ...
    }
}

class Child extends Parent{
	@Override
    public void method(){
    	super().method();
        ...
    }
}

 

 

 

final 클래스와 final 메소드

final 클래스

클래스를 선언할 때 final 키워드를 class 앞에 붙이면 최종적인 클래스이므로 더이상 상속할 수 없다.

즉, final클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없다.

public final class 클래스{...}


//대표적인 예
public final class String {...}

 

protected 접근 제한자

접근 제한자 제한 대상 제한 범위
protected 필드, 생성자, 메소드 같은 패키지이거나, 자식 객체만 사용 가능

 

타입 변환

자동 타입 변환

부모타입 변수 = 자식타입객체;
Cat cat = new Cat();
Animal animal = cat;

 

강제 타입 변환

자식타입 변수 = (자식타입) 부모타입객체;
Parent parent = new Child();
Child child = (Childe)parent;

 

다형성

다형성이란? 사용방법은 동일하지만 실행 결과가 다양하게 나오는 성질을 말한다.

상속으로 인해 부모의 메소드를 오버라이딩을 하면서 다양하게 수정해서 사용할 수 있다.

 

필드 다형성

필드 타입은 동일하지만, 대입되는 객체가 달라져서 실행결과가 다양하게 나옴.

public class Car{
	public Tire tire;
    
    public void run(){
    	this.roll();
        //tire필드에 대입된 객체의 roll()메소드를 실행. 
        //만약 Tire을 상속받은 hankook, kumho가 roll()메소드를 재정의하고 있다면, 그 roll()이 호출됨.
    }
}

 

매개변수 다형성

메소드가 매개변수로 클래스 타입을 갖고 있을 때도 다형성이 발생한다.

public class Driver{
	public void drive(Vehicle vehicle){
    	vehicle.run();
        //매개값으로 받은 vehicle의 run()을 실행할텐데
        //매개변수로 받은 객체가 Vehicle을 상속받아 run()을 재정의하고 있다면,
        //그 run()을 실행한다.
    }
}

 

객체 타입 확인

boolean result = 객체 instanceof 타입;
public void method(Parent parent){
	if(parent instanceof Child){
    	Child child =(Child)parent;
    }
}

 

 

추상 클래스

추상 클래스란?

객체를 생성할 수 있는 실체 클래스의 공통적인 필드나 메소드를 추출해서 선언한 클래스

Animal animal = new Animal(); //X

추상 클래스는 객체를 직접 생성할 수 없다.

 

추상 클래스 선언

pubic abstract class 클래스명{
//필드
//생성자
//메소드
}

 

추상 메소드와 재정의

abstract 리턴타입 메소드명(매개변수,...);
public abstract class Animal{
	abstract void sound();
}

 

봉인된 클래스

JAVA15 부터 무분별한 자식 클래스 생성을 방지하기 위해 봉인된(sealed) 클래스가 도입되었다.

public sealed class Person permits Employee, Manager {...}

Person의 자식 클래스는 Employee와 Manager만 가능하다.

728x90
반응형
LIST

'IT > JAVA' 카테고리의 다른 글

[JAVA] #9 중첩 선언과 익명 객체  (0) 2023.04.17
[JAVA] #8 인터페이스  (0) 2023.04.14
[JAVA] #6 클래스(Class)-2  (0) 2023.04.10
[JAVA] #6 클래스(Class)-1  (0) 2023.04.10
[JAVA] #2 변수와 타입  (0) 2023.04.06
728x90
반응형
SMALL

인스턴스 멤버

구분 설명
인스턴스(Instance)멤버 객체에 소속된 멤버
(객체를 생성해야만 사용할 수 있는 멤버)
정적(static)멤버 클래스에 고정된 멤버
(객체 없이도 사용할 수 있는 멤버)

인스턴스 멤버 선언 및 사용

public class Car{
	//인스턴스 필드 선언
    int gas;
    
    //인스턴스 메소드 선언
    void setSpeed(int speed) { ... }
}
Car myCar = new Car();
myCar.gas =10;
myCar.setSpeed(60);

Car yourCar = new yourCar();
yourCar.gas = 20;
yourCar.setSpeed(80);

=> 외부 클래스에서 사용하기 위해서는 Car객체를 먼저 생성하고 참조 변수로 접근해서 사용해야 한다.

 

this 키워드

: 객체 내부에서 인스턴스 멤버에 접근하기 위해 this사용. 객체는 자기 자신을 'this'라고 한다.

public class Car{
	//필드 선언
	String model;
    int speed;
    
    Car(String model){
    	this.model = model; //매개변수를 필드에 대입.(this 생략 불가)
    }
    
    void setSpeed(int speed){
    	this.speed=speed;
    }
    
    void run(){
    	this.setSpeed(100); //this 생략 가능
        System.out.println(this.model + "가 달립니다. (시속: " + this.speed + ")");
    }
}

 

정적 멤버

정적 멤버란 메소드 영역의 클래스에 고정적으로 위치하는 멤버를 말한다. 객체 생성 없이 바로 사용 가능.

정적 멤버 선언

필드와 메소드는 모두 정적 멤버가 될 수 있음. static 키워드 추가.

public class 클래스 {
	//정적 필드 선언
    static 타입 필드 [= 초기값];
    
    //정적 메소드
    static 리턴타입 메소드(매개변수,...){
    	...
    }
}

 

정적 멤버 사용

클래스 이름과 함께 도트(.) 연산자로 접근한다.

public class Calculator {
	static double pi = 3.141592;
    static int plus(int x, int y){ ... }
    static int minus(int x, int y){ ... }
}

double result1 = 10 * 10 * Calculator.pi;
int result2 = Calculator.plus(10,5);
int result3 = Calculator.minus(10,5);

 

정적 블록

//정적 블록 형태
static {
...
}
public class Television {
	static String company ="MyCompany";
    static String model = "LCD";
    static String info;
    
    static{
    	info = company + "-" + model;
    }
}

public class TElevisionExample {
	pulic static void main(Strings[] args){
    	System.out.println(Television.info);
    }
}

인스턴스 멤버 사용 불가

정적 메소드/블록은 객체가 없어도 실행된다는 특징 때문에 내부에 인스턴스 필드/메소드를 사용할 수 없다.

또한 객체 자신의 참조인 this도 사용 불가.

 

final 필드와 상수

final 필드 선언

final = 최종적. final 필드는 초기값이 저장되면 이것이 최종적인 값이 되어 수정할 수 없다.

final 타입 필드 [=초기값];

* 초기값을 줄 수 있는 방법

1) 필드 선언 시에 초기값 대입

2) 생성자에서 초기값 대입

 

상수 선언

상수는 불변값으로 static이면서 final인 특성을 가져야 한다.

상수 이름은 대문자로 작성하고 단어혼합일 경우 _로 연결한다.

static final 타입 상수;
static{
	상수 = 초기값;
}

static final double PI = 3.14159;
static fianl double EARTH_AREA = 5.147185403;

 

패키지

클래스는 패키지 안에 생성해서 관리한다. 디렉토리만을 의미하지 않으며 클래스의 일부분이다.

패키지 선언

역순으로 쓰며 소문자로 작성한다.

package 상위패키지.하위패키지;

public class 클래스명 {...}
com.samsung.projectname
com.lg.projectname
org.apache.projectname

 

import

다른 패키지에 있는 클래스를 사용하려고 할 때 쓴다.

package com.mycompany;

import com.hankook.Tire;

pubic class Car{
	Tire tire = new Tire();
}

만약 동일한 패키지에포함된 다수의 클래스를 사용해야 한다면 클래스명 대신 *로 표현한다.

import com.hankook.*;
import com.kankook.project.*;

 

접근 제한자

접근 제한자 제한 대상 제한 범위
public 클래스, 필드, 생성자, 메소드 없음
protected 필드, 생성자, 메소드 같은 패키지이거나, 자식 객체만 사용가능
default 클래스, 필드, 생성자, 메소드 같은 패키지
private 필드, 생성자, 메소드 객체 내부

클래스의 접근 제한

클래스는 public과 default 접근 제한을 가질 수 있다.

[public] class 클래스 { ... }

 

생성자의 접근 제한

생성자는 public, default, private 접근 제한을 가질 수 있다.

pubic class ClassName{
	[public | private] ClassName(){...}
}

 

필드와 메소드의 접근 제한

필드와 메소드는 public, default, private 접근 제한을 가질 수 있다.

//필드 선언
[public | private] 타입 필드;

//메소드 선언
[public | private] 리턴타입 메소드(...){...}

 

Getter와 Setter

객체의 필드를 외부에서 마음대로 읽고 변경할 경우 무결성이 깨질 수 있다.

필드를 private 접근 제한을 갖게 하여 외부에서 접근하지 못하도록 하고 get/set 메소드를 이용하게 한다.

private 타입 fieldName;

public 타입 getFieldName(){
	return fieldName;
}

public 타입 setFieldName(타입 fieldName){
	this.fieldName = fieldName;
}

 

싱글톤 패턴

애플리케이션 전체에서 단 한 개의 객체만 생성해서 사용하고 싶다면 싱글톤 패턴을 적용한다.

생성자를 private 접근 제한해서 외부에서 new 연산자로 생성자를 호출할 수 없도록 막는 것이다.

public class 클래스{
	//private 접근 권한을 갖는 정적 필드 선언과 초기화
	private static 클래스 singleton = new 클래스();
    
    //private 접근 권한을 갖는 생성자 선언
    private 클래스(){}
    
    //public 접근 권한을 갖는 정적 메소드 선언
    public static 클래스 getInstance(){
    	return singleton;
    }
}

 

 

728x90
반응형
LIST

'IT > JAVA' 카테고리의 다른 글

[JAVA] #8 인터페이스  (0) 2023.04.14
[JAVA] #7 상속  (0) 2023.04.11
[JAVA] #6 클래스(Class)-1  (0) 2023.04.10
[JAVA] #2 변수와 타입  (0) 2023.04.06
[JAVA] #0 Eclipse 설치 및 환경 구축  (0) 2023.04.06
728x90
반응형
SMALL

객체 지향 프로그래밍

객체란?

물리적으로 존재하거나 개념적인 것 중에서 다른 것과 식별 가능한 것.

속성과 동작으로 구성.

 

객체 간의 관계

-집합 관계: 완성품과 부품의 관계

-사용 관계 : 다른 객체의 필드를 읽고 변경하거나 메소드를 호출하는 관계

-상속 관계 : 부모와 자식 관계.

 

객체 지향 프로그래밍의 특징

-캡슐화 : 객체의 데이터, 동작을 하나로 묶고 실제 구현 내용을 외부에 감추는 것. 접근 제한자 사용

-상속 : 부모 객체는 자기가 갖고 있는 필드와 메소드를 자식 객체에게 물려주어 자식 객체가 사용할 수 있도록 한다.

=>코드의 재사용성을 높여줌

=>유지 보수 시간을 최소화 시켜줌

-다형성 : 실행 결과가 다양하게 나오게 해주는 성질. 자동 타입 변환과 재정의 기술 필요.

 

객체와 클래스

-객체를 생성하려면 클래스가 필요.

-클래스로부터 생성된 객체를 해당 클래스의 인스턴스라고 부른다.

-인스턴스화 : 클래스로부터 객체를 만드는 과정.

 

클래스 선언

//클래스 선언
public class 클래스명 {
}

 

객체 생성과 클래스 변수

클래스 변수 = new 클래스();
Student s1 = new Student();
System.out.println("s1변수는 Student 객체 참조.");

Student s2 = new Student();
System.out.println("s2변수는 또다른 Student 객체 참조");

 

클래스의 구성 멤버

- 필드 : 객체의 데이터가 저장되는 곳

- 생성자 : new 연산자로 객체를 생성할 때 초기화 역할을 담당.

- 메소드 : 객체가 수행할 동작.

public class ClassName{
	//필드 선언
    int fieldName;
    
    //생성자 선언
    ClassName(){...}
    
    //메소드 선언
    int methodName(){...}
}

 

필드 선언과 사용

필드 선언

타입 필드명 [ = 초기값 ];
public class Car{
	//필드 선언
    String model;
    boolean start;
    int speed;
}

 

필드 사용

[외부 객체에서 필드 사용]
void method(){
	//Car 객체 생성
    Car myCar = new Car();
    //필드 사용
    myCar.speed=60;
}

[내부 객체에서 필드 사용]
int speed;
//생성자에서 사용
Car(){
	speed= 60;
}

//메소드에서 사용
void method(...){
	speed=60;
}

 

생성자 선언과 호출

기본 생성자

[public] 클래스(){...}

 

생성자 선언

public class Car{
	//생성자 선언
    Car(String model, String color, int maxSpeed){...}
}

 

필드 초기화

public class Korean{
	//필드 선언
    String nation ="대한민국";
    String name;
    String ssn;
    
    Korean(String name, String ssn){
    	this.name=name;
        this.ssn=ssn;
    }
}

 

생성자 오버로딩

매개값으로 객체의 필드를 다양하게 초기화하려면 생성자 오버로딩 필요.

매개변수를 달리하는 생성자를 여러 개 선언하는 것을 말한다.

public class Car{
	Car(){...}
    Car(String model){...}
    Car(String model, String color){...}
    Car(STring model, String color, int maxSpeed){...}
}

 

다른 생성자 호출

생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있다.

따라서 공통 코드를 한 생성자에게만 집중작성하고, 나머지 생성자는 this()를 사용한다.

Car(String model){
	this(model, "은색", 250);
}

Car(String model, String color){
	this(model, color, 250);
}

Car(String model, String color, int maxSpeed){
	this.model = model;
    this.color = color;
    this.maxSpeed = maxSpeed;
}

 

메소드 선언과 호출

메소드 선언

리턴 타입 메소드명 (매개변수1, ... ){

         실행 블록...

}

 

리턴 타입

리턴 타입은 메소드가 실행한 후 호출한 곳으로 전달되는 결과값의 타입을 말한다.

리턴값이 없을 때는 void로 작성!

void powerOn() { ... } //리턴값이 없는 메소드 선언
double divide(int x, int y){ ... } //double타입 값을 리턴하는 메소드 선언

 

메소드명

메소드명은 첫 문자를 소문자로 시작하고, 캐멀스타일로 작성한다.

*캐멀스타일 : 단어 연결할 때 두번째 단어의 첫 글자를 대문자로!

void run(){ ... }
void setSpeed(int speed){ ... }
String getName(){ ... }

 

매개변수

메소드를 호출할 때 전달한 매개값을 받기 위해 사용. 생략 가능

double divide(int x, int y){ ... }

 

실행블록

publi class calculator {
	//리턴값이 없는 메소드 선언
    void powerOn(){
    	System.out.println("전원을 켭니다.");
    }
}
void method(){
	Calculator c = new Calculator();
    c.powerOn();
}

 

메소드 호출

메소드 블록을 실행하는 것을 말한다. 객체가 존재해야 호출할 수 있다.

타입 변수 = 메소드();
//외부 객체에서 선언
void method(){
	Calculator calc = new Calculator();
    calc.powerOn();
    int r1 = calc.plus(3,5);
    double r2 = calc.divide(15,3);
}
//객체 내부에서 선언
Calculator(){
	powerOff();
}

void powerOn(){ ... }
void powerOff(){ ... }
int plus(int x, int y){ ... }
double divide(int x, int y){ ... }

void method() {
	powerOn();
    int r1 = plus(3,5);
    double r2 = divide(15,3);
}

 

가변길이 매개변수

매개변수의 개수에 맞게 매개값을 제공해야함.

만약 메소드가 가변길이 매개변수를 갖고 있다면 매개변수 개수와 상관없이 매개값 전달 가능.

int sum(int ... values){

}
int result = sum(1,2,3);
int result = sum(1,2,3,4,5);
int[] values = {1,2,3};
int result = sum(values);

int result2 = sum(new int[] {1,2,3);
//매개값들이 자동으로 배열 항목으로 변환되기 때문에 배열을 매개값으로 전달 가능

 

return 문

return은 메소드의 실행을 강제 종료하고 호출한 곳으로 돌아간다는 의미.

메소드 타입이 있을 경우 return 문 뒤에 맞는 리턴값 추가.

return [리턴값];

 

메소드 오버로딩

메소드 이름은 같되 매개변수의 타입, 개수, 순서가 다른 메소드를 여러개 선언하는 것.

void println(){...}
void pintln(double x){...}
void println(int x){...}
void println(String s){...}
void println(int x, double y){...}
728x90
반응형
LIST

'IT > JAVA' 카테고리의 다른 글

[JAVA] #8 인터페이스  (0) 2023.04.14
[JAVA] #7 상속  (0) 2023.04.11
[JAVA] #6 클래스(Class)-2  (0) 2023.04.10
[JAVA] #2 변수와 타입  (0) 2023.04.06
[JAVA] #0 Eclipse 설치 및 환경 구축  (0) 2023.04.06
728x90
반응형
SMALL

파이썬 설치하기

1. 파이썬 공식 홈페이지에 접속하여 [Downloads] 메뉴 클릭 -> 'Download Python 3.12.3' 클릭하여 설

 

Welcome to Python.org

The official home of the Python Programming Language

www.python.org

 

2. 설치를 시작하면 아래의 화면이 나오는데 아래 2개 체크하 'Install Now' 클릭

Add python.exe to PATH 는 실행 경로에 파이썬을 추가하는 것이므로 추후 cmd창에서 'python'을 입력하여 실행할 수 있다.

 

3. 설치 중

 

4. 설치 완료 후에는 [시작]메뉴를 보면 [Python 3.12]가 설치된 것을 확인할 수 있다.

 

파이썬 실행하기

위에서 우리가 설치한 것은 파이썬으로 작성된 코드를 실행해주는 프로그램이다. 

이 프로그램을 Interpreter라고 한다.

파이썬 인터렉티브 셸 실행

위에서 설치한 파일 중 Python 3.12 (64-bit) 프로그램을 실행해보자.

 

그럼 아래와 같은 화면이 나타난다.

검은색 화면에 프롬프트인 '>>>' 옆으로 커서가 깜빡거린다.

이 프로그램은 파이썬 명령어를 한 줄씩 실행해 볼 수 있다.

 

간단한 코드를 입력해보자.

>>>15+20
//15와 20을 더하라는 의미
>>>"Hello world" * 3
//Hello world를 3번 출력하라는 의미

한 줄씩 입력할 때마다 그의 결과를 바로바로 확인할 수 있다.

 

파이썬 IDLE 에디터 실행하기

위와 같은 경우 간단한 결과를 확인할 때는 편리하지만, 긴 코드를 사용할 때는 불편하다.

그래서 텍스트 에디터 프로그램을 사용한다.

 

이번에는 [시작] -> [Python 3.12] -> IDLE (Python 3.12 64-bit)를 실행해보자.

 

그럼 이와 같은 화면이 나타난다. 그런데 여기서도 현재 한 줄씩만 실행이 가능하다.

 

[File] -> [New File] 클릭하면 아래와 같이 새 창이 나타난다.

 

그럼 다음과 같은 코드를 입력해보자.

print("IDLE에서 파이썬 코드를")
print("작성해서 출력해 보는")
print("코드입니다.")

 

작성 후 [File] -> [Save] 메뉴를 선택하고 원하는 폴더에 'sample'로 저장.

 

이어서 [Run] -> [Run Module] 메뉴 클릭하여 실행

실행 결과

 

비주얼 스튜디오 코드 실행하기

비주얼 스튜디오 코드 홈페이지에 접속해서 [Download for Windows'를 클릭하여 설치하자.

 

동의합니다를 클릭 후 [다음]클릭

 

원하는 폴더를 설정하고 [다음] 클릭. 저는 그대로 했습니다.

 

시작 메뉴 폴더 이름을 지정 후 [다음]클릭

 

만약 바탕화면에 바로가기를 만들고 싶다면 체크 후 [다음] 클릭

 

설정들을 확인 후 [설치] 클릭

 

아래와 같은 설치 중인 화면을 확인할 수 있음

 

[종료] 버튼을 눌러 비주얼 스튜디오 코드 프로그램을 실행

 

실행이 됐다면 모든 메뉴가 영어이기 때문에 한글로 변경해준다.

[Extension] -> 'korean'검색 -> [Install] 클릭

 

설치가 완료됐다면 오른쪽 아래에 'Change Language and Restart' 클릭하여 재실행.

 

이제 코드를 작성하여 실행해보자. [파일] -> [새 파일] 메뉴 클릭하여 코드 입력

print("Hello wolrd!")

 

다음으로 [파일] -> [저장] 클릭 후 hello.py 로 저장하면 파일명이 변경되고 오른쪽 아래에서 '권장 사항 표시'를 클릭

 

그럼 아래와 같은 화면이 나오는데 [설치] 클릭

 

설치가 완료됐다면 파이썬 프로그램을 실행해보자.

파이썬 파일이 있는 탐색기로 가서 [Shift]를 누른 채 마우스 우클릭 후 [여기서 PowerShell 창 열기] 를 클

 

그럼 셸 창이 나타나고 'python hello.py'를 입력하고 'Enter'를 누르면 실행된 결과가 출력된다.

728x90
반응형
LIST

'IT > Python' 카테고리의 다른 글

[Python] 5. 문자열(String) 만들기  (0) 2024.06.03
[Python] 4. 기본 자료형  (0) 2024.06.03
[Python] 3. 주석과 기본 출력 print()  (0) 2024.06.03
[Python] 2. 파이썬 용어들  (0) 2024.06.03
[Python] 0. 파이썬의 장단점  (0) 2023.04.08
728x90
반응형
SMALL

파이썬이란?

1991년 네덜란드계 SW엔지니어인 귀도 반 로섬이 발표한 고급 프로그래밍 언어.
인터프리터를 사용하는 객체지향 언어이다.

 

파이썬의 장점

1. 문법이 간단하고 읽기 쉽다.

2. 많은 사람들이 사용하고 있어 다양한 분야에 활용이 가능하다.

3. 유용한 라이브러리가 풍부하다.

4. 대부분 OS에서 동일한 방법으로 사용할 수 있다.

 

파이썬의 단점

1. 인터프리터 언어이므로 컴파일 언어보다 실행 속도가 느린 편이다.

2. 멀티스레딩을 활용할 수 없다.

3. 모바일에 적합하지 않다.

728x90
반응형
LIST
728x90
반응형
SMALL

1. 분석 거버넌스 체계 구성 요소

2. 데이터 분석 수준진단

- 조직의 성숙도 평가도구 : CMMI(Capability Maturity Model Integration)

- 분석 수준 진단 결과 : 정착형, 확산형, 준비형, 도입형

 

3. 데이터 거버넌스 체계 수립

1) 데이터 거버넌스 개요

- 전사 차원의 모든 데이터에 대해 정책 및 지침, 표준화, 운영조직 및 책임 등의 표준화 된 관리 체계를 수립하고 운영을 위한 프레임워크 및 저장소를 구축하는 것을 말함

- 마스터 데이터, 메타 데이터, 데이터 사전은 데이터 거버넌스의 중요한 관리 대상

 

2) 데이터 거버넌스 구성요소

- 원칙, 조직, 프로세스

 

3) 데이터 거버넌스 체계

- 데이터 표준화, 데이터 관리 체계, 데이터 저장소 관리, 표준화 활동

 

4. 데이터 분석을 위한 3가지 조직 구조 : 집중구조, 기능구조, 분산구조

 

5. 분석과제 관리 프로세스

 

728x90
반응형
LIST

+ Recent posts