생성자는 인스턴스가 생성될 때 값을 초기화하는 용도로 사용된다.

생성자도 한 클래스의 메소드로써 호출이 가능하다.

하지만 일반적인 메소드와 다른 특수한 형태의 메소드라고 생각하면 된다.

 

생성자는 다음과 같은 특성을 갖는다.

1. 클래스와 동일한 이름을 갖는다.

2. 반환형이 없다. (return 을 사용할 수 없다.)

3. 매개변수는 사용할 수 있다. (매개변수가 없는 생성자를 '기본 생성자'라 한다.)

4. 한 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.

- 선언이 없는 경우 자바 컴파일러가 기본 생성자를 자동으로 생성한다.

- 선언이 있을 경우에는 자바 컴파일러가 자동으로 생성하지 않는다.

5. 메소드 오버로딩을 사용하여 같은 이름의 생성자를 만들 수 있다.

(오버로딩에 대해선 다음 포스팅에서 자세하게 다룬다.)

 

<소스 코드>

public class Card {
	private String kind;		// 카드의 종류
	private int number;
	static int width = 100;
	static int heigth = 250;
	
	public Card() {
		// 기본 생성자
		kind = "Joker";
		number = 0;
	}
	
	public Card(String k , int  n) {
		// 매개변수가 있으므로 기본 생성자 아님
		kind = k;
		number = n;
	}
	public String getKind() {
		return kind;
	}

	public void setKind(String kind) {
		this.kind = kind;
	}

	public int getNumber() {
		return number;
	}

	public void setNumber(int number) {
		this.number = number;
	}
}
 

위의 코드를 보면 생성자의 특성 5가지가 모두 만족되는 것을 확인할 수 있다.

public class CardManager {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Card c1 = new Card("Heart", 2);     // 원하는 카드를 생성
		Card c2 = new Card(); 				// Joker 를 생성
                System.out.println("카드1 종류 : " + c1.getKind());
		System.out.println("카드1 번호 : " + c1.getNumber());
		System.out.println("카드2 종류 : " + c2.getKind());
		System.out.println("카드2 번호 : " + c2.getNumber());	
          }
}
 

실행 결과와 main 소스 코드에서 인스턴스를 생성한 부분을 보면 생성 시 입력한 매개변수의 값에 따라 카드의

데이터가 입력된 것을 확인할 수 있다.

 

'JAVA' 카테고리의 다른 글

상속  (0) 2022.08.28
오버로딩  (0) 2022.08.28
배열 / foreach 사용  (0) 2022.08.28
import  (0) 2022.08.28
Package  (0) 2022.08.28

 

C / C++ 과 JAVA의 배열 문법이 달라 다소 익숙하지 않아 별도로 내용을 정리한다.

또한 배열과 함께 사용하는 새로운 예약어 foreach 에 대하여 정리한다.

 

1. 배열의 선언

기존 C / C++에서 사용한 배열은 int arr [10] 과 같이 선언했다면 자바에서는 다른 모습으로 선언이 가능하다.

private final static int SIZE = 10;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int[] score = new int[SIZE];
		int total = 0;
		Scanner scan = new Scanner(System.in);
 

선언된 모습을 C 와 비교해보면 우선 대괄호 [ ] 가 이름의 좌측에 들어간다. 이 괄호 안에는 어떠한 것도 들어가면 안된다.

 

우항을 보면 new 를 통해 메모리를 동적 할당한다는 것을 알 수 있다. 즉, 배열 자체는 Heap 영역에 할당된다.

C 에서는 단순히 변수의 나열로 취급하여 Stack에 쌓지만 Java 에서는 그렇지 않다.

 

또한 우항에는 변수의 이름 없이 자료형 [ 크기 ] 형태로 공간을 할당한다. 여기서 SIZE 는 main 위에서 이미 생성된

변수임을 확인할 수 있다. C의 배열 선언에서는 [#define] 된 값 또는 상수로만 배열의 크기를 결정할 수 있었다면,

자바에서는 선언에서도 변수를 사용하여 그 값 만큼 공간이 생긴다는 것을 알 수 있었다.

 

※ C 에서는 배열의 크기를 선언 후 바꿀 수 없지만 자바에서는 배열의 사이즈를 바꿀 수 있다.

하지만 사이즈 변경 전 데이터들은 모두 사라진다.

 

2. 배열 사용하기

배열을 사용하는 방법은 C 와 같다. 위의 코드를 이어서 사용하는 코드는 아래와 같다.

for(int i = 0; i < SIZE; i++) {
	System.out.print((i+1) + "점수 입력 : ");
        score[i] = scan.nextInt();  // 배열에 값 입력하기
}

for(int j = 0; j < SIZE; j++) {
	total += score[j];   // 배열 각 인덱스의 값을 total에 합산
}
System.out.println("total = "+ total);	
total = 0;
 

3. foreach 사용하기

C / C++ 에서는 없지만 자바에서는 향상된 for 문을 지원한다.

우선 사용 방법은 다음과 같다.

for(int s : score) {	// score 처럼 배열 형태로 들어와야한다. // 값을 입력할 땐 사용할 수 없다.
	total += s;
}
System.out.println("total = " + total); 
 

예약어를 보면 일반적인 for 이지만 소괄호 ( ) 의 내용을 보면 기존에 알던 모습과 매우 다르다.

foreach는 배열 형태의 자료구조에서 첫 번째 데이터부터 마지막 데이터를 순차적으로 꺼내와 사용하는데 좋다.

즉,

for ( int s : score )

 

이 문장의 의미는 score 배열의 각 인덱스의 값을 s 에 넣으며 score 의 사이즈만큼 반복을 한다는 의미이다.

즉, 배열의 사이즈를 몰라도 사이즈만큼 횟수만큼 반복하고 그 후 종료된다.

 

foreach 를 사용하는데 주의할 점은 꺼내와 사용하는데 초점이 맞춰진 기능이므로 값 입력하는 용도로는 사용이 불가하다.

 

<전체 소스코드>

package com.jsg;

import java.util.Scanner;

public class ClassManager {

	private final static int SIZE = 10;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int[] score = new int[SIZE];
		int total = 0;
		Scanner scan = new Scanner(System.in);
		
		for(int i = 0; i < SIZE; i++) {
			System.out.print((i+1) + "점수 입력 : ");
			score[i] = scan.nextInt();
		}
		
		for(int j = 0; j < SIZE; j++) {
			total += score[j];
		}
		System.out.println("total = "+ total);
		
		total = 0;
		
		for(int s : score) {	// score 처럼 배열 형태로 들어와야한다. // 값을 입력할 땐 사용할 수 없다.
			total += s;
		}
		System.out.println("total = " + total); 
	}
}
 

실행결과에서 보면 total 의 값이 두 번 출력된다.

그 중 아래쪽 total 은 foreach 로 연산한 결과가 기존 for문과 동일한 것을 확인할 수 있다.

 

'JAVA' 카테고리의 다른 글

오버로딩  (0) 2022.08.28
생성자  (0) 2022.08.28
import  (0) 2022.08.28
Package  (0) 2022.08.28
MVC 패턴  (0) 2022.08.28

 

import 는 기존에 이클립스에서 자바 프로젝트를 불러올 때 사용하였다.

이번에 다룰 import는 그와 다른 예약어 import 를 말한다.

 

import의 사전적 뜻은 수입, 수입품 이다. 즉 외부에서 가져온다는 것을 의미한다.

자바에서의 import는 뜻과 같이 다른 패키지의 클래스를 불러오는 것이다.

 

클래스를 만들 때 임포트 되는 것은 기본적으로 동일 패키지 내의 클래스들과 java.lang 패키지이다.

하지만 그 외에 다른 패키지의 클래스에 접근하여 원하는 기능을 가져와야할 경우도 많다.

 

1. import 사용하기

현재까지 가장 많이 임포트한 클래스는 입력받기 위해 사용한 Scanner 이다.

그리고 Scanner를 사용하기 위해 package 하단에서 아래 문장을 볼 수 있었다.

import java.util.Scanner;
 

이 코드의 의미는 " java.util 패키지의 Scanner 를 가져오겠다" 라는 의미이며 실제로 java 폴더를 찾아보면

존재한다는 것을 알 수 있다. C:\Program Files\Java\jdk1.8.0_221 에서 src 압축파일을 살펴보자.

위 처럼 Scanner 가 존재한다는 것을 확인할 수 있다.

 

2. 내가 만든 클래스 import 하기

만약 자신이 만든 클래스를 임포트하고 싶다면 다음과 같이 해주면 된다.

대표사진 삭제

사진 설명을 입력하세요.

좌측의 패키지 익스플로러와 코드를 보면 다른 패키지에서 클래스를 불러온 것을 확인할 수 있다.

만약 클래스를 임포트하지 않는 다면 다음과 같은 일이 발생한다.

에러를 살펴보면 Score를 해결할 수 없다고 뜨며 그 아래에 해결방법으로 import 하라는 것을 볼 수 있다.

 

3. 패키지 내의 모든 클래스를 import 하는 방법

만약 패키지 내에 여러 클래스를 import 한다 하면 각 클래스마다 한 줄씩 import 를 작성하여야 한다.

만약 import 할 패키지가 100개라면 100줄의 import 를 작성해야할까?

 

이 때 * (애스터 리스크) 를 사용하면 패키지 내 모든 클래스를 import 할 수 있다.

위 이미지를 보면 동일한 코드이나 import 부분만 * 로 바뀐 것을 확인할 수 있다.

 

4. static (클래스) 변수 와 static (클래스) 메소드를 import 하는 방법

JDK 5부터는 import static 이 추가되어 static 으로 선언된 클래스 변수 또는 클래스 메소드를 사용할 수 있다.

아래 코드를 보자.

package com.pack;

public class TestClass {
	
	public static String str = "Test";
	public static void testClass_Method() {
		System.out.println("testClass_Method() Call!!");
	}
}
 

com. pack 패키지의 TestClass 를 선언하여 str 과 testClass_Method() 를 static 으로 선언하였다.

package com.pack.sub;

import com.pack.TestClass;

public class UseClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TestClass.testClass_Method();
		System.out.println(TestClass.str);
	}

}
 

TestClass 를 임포트하여 static 으로 선언된 변수와 메소드를 사용하는 것을 확인할 수 있다.

이제 두 번째 코드를 수정하여 import static 을 사용해 보면 다음과 같다.

package com.pack.sub;

import static com.pack.TestClass.str;
import static com.pack.TestClass.testClass_Method;

public class UseClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		testClass_Method();
		System.out.println(str);
	}
}
 

차이점은 다음과 같다.

 

import -> import static

com.pack.TestClass -> com.pack.TestClass.str , com.pack.TestClass.testClass_Method

TestClass.testClass_Method() -> TestClass.testClass_Method()

System.out.println(TestClass.str) -> System.out.println(TestClass.str)

 

즉, import static 을 사용하면 다른 패키지의 static 변수, 메소드 이지만 변수명과 메소드명 만으로도

쉽게 사용할 수 있다.

 

만약 일일이 import static 으로 선언하기 귀찮다면 다음과 같이 사용할 수 있다.

 

import static com.pack.TestClass.* ;

package com.pack.sub;

import static com.pack.TestClass.*;   // 애스터 리스크(*) 사용
//import static com.pack.TestClass.testClass_Method;

public class UseClass {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		testClass_Method();    // 정상적으로 사용 가능
		System.out.println(str);
	}
}
 

참고) 만약 import static 한 클래스 변수와 자신의 클래스 변수의 이름이 같다면?

package com.pack.sub;

import static com.pack.TestClass.str;
import static com.pack.TestClass.testClass_Method;

public class UseClass {

	static String str = "내가 먼저다!";	// 이름이 같은 클래스 변수 생성
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		testClass_Method();
		System.out.println(str);
	}
}
 

실험 결과 자기 클래스의 클래스 변수가 우선 실행된다.

 

'JAVA' 카테고리의 다른 글

생성자  (0) 2022.08.28
배열 / foreach 사용  (0) 2022.08.28
Package  (0) 2022.08.28
MVC 패턴  (0) 2022.08.28
접근 제어자  (0) 2022.08.28

 

키지란 보통 상자 또는 포장물 이란 의미로 일상에서 사용된다.

JAVA 에서의 패키지는 클래스들을 구분 짓는 폴더와 비슷한 개념이다.

 

JAVA로 프로그램을 만들 때 프로그램의 범위로 따져본다면 다음과 같다.

위의 이미지와 같이 Class < Package < Project 순으로 범위가 크다.

여기서 Package는 Class 보다 상위 개념이기에 각 패키지는 각각의 클래스들로 구성된다는 것을 알 수 있다.

마찬가지로 Project 또한 각각의 패키지들로 구성된다.

 

1. 패키지 만들기

패키지를 만드는 방법은 간단하다.

프로젝트 하단의 src 폴더에서 우클릭 후 new -> package 를 선택하여 패키지의 이름을 정하고 Finish 하면 된다.


 

 

또는 클래스를 만들 때 나오는 창에서 상단의 package 부분에 이름을 적어주면 자동으로 생성된다.

 

위에서 말했듯 패키지는 클래스들을 구분 짓는 폴더의 개념이다.

그렇다면 패키지 안에서 패키지를 만들 수도 있지 않을까? 즉, 하위 폴더를 만드는 개념이라 생각하면 된다.

패키지 내부에서 패키지를 만들고 싶다면 . (dot) 을 사용한다.

상위 패키지 이름 . 하위 패키지 이름

 

위 과정을 거치면 패키지 익스플로러에 다음과 같이 나올 것이다.

위 이미지에서 주목해야할 점은 하위 패키지로 생성하였지만 패키지 익스플로러에서는 test001이 test01 의

하위에 존재하지 않는 다는 것이다. 하지만 아래 폴더 이미지에서는 test01 밑에 test001 이 있는 것을 볼 수 있다.

 

Test Class 까지 생성하면 코드에 다음과 같이 자동으로 선언된 것을 확인할 수 있다.

'JAVA' 카테고리의 다른 글

배열 / foreach 사용  (0) 2022.08.28
import  (0) 2022.08.28
MVC 패턴  (0) 2022.08.28
접근 제어자  (0) 2022.08.28
변수  (0) 2022.08.28

 

MVC 패턴은 Model, View, Controller 의 약자로 세 가지로 기능을 구분하여 작성하는 형식을 말한다.

형식을 따르지 않아도 프로그램 작성은 가능하지만 효율적인 코드 작성 및 관리를 위해 사용을 권장하며 이러한

형식을 디자인패턴(Design Pattern)이라 말한다.

 

MVC패턴을 사용하는 이유

Model, VIew, Controller 는 다음과 같은 기능을 담당한다.

 

· View

사용자로 부터 입력을 받거나,

사용자에게 출력을 담당

 

· Controller

Model 과 View를 제어.

- 시간적 처리 순서

- 값 전달 등

 

· Model (또는 service 클래스라 불림.)

전달된 데이터 처리를 담당

 

위와 같이 코드를 작성하게 되면 개발자 입장에서는 매우 편리한 이점을 얻을 수 있다.

예를 들어 학생의 점수를 입력받는 클래스를 만든다 하면 View 에서 작성하고 추후에 원하는 기능을 쉽게 찾거나

수정할 수 있다. 즉, 각 코드에 대해 깔끔하게 정리정돈이 가능하다.

 

두 번째는 DB와 연동을 하게 된다면 혼잡하게 섞인 코드와 달리 MVC로 정리된 코드는 쉽게 관리가 가능하다.

제어되거나 입력하는 부분이 이곳 저곳에 섞여있다면 DB와 데이터를 주고 받을때 여러 곳에서 처리가 이루어진다.

하지만 MVC 패턴에서는 기능별로 정리가 되어 있으므로 DB와 직접적으로 관련된 Model 쪽에서만 처리할 수

있도록 해주면 시간적으로나 코드 관리 부분에서 많은 이점을 얻을 수 있다.

이처럼 다른 프로그램과 연동될 때 아래 처럼 관계를 갖는다면 효율적인 관리가 가능하다.

 

※ Model 이 DB 와 관련있는 이유는 처리에 대한 부분은 Model 에서 관리하기에 DB와 데이터를 연동하는 기능 또한 Model 에

존재하기 때문이다.

※ DTO (Data Transmiter Object) : 데이터를 담기 위한 그릇. 기능을 만들기 위한 멤버변수를 가지고 있는 영역(또는 클래스).

 

<소스코드>

점수를 입력하여 A ~ F 까지 등급으로 환산하는 프로그램이다.

 

1. VIew

package com;

import java.util.Scanner;

public class InputClass {
	Scanner scan = new Scanner(System.in);
	
	public int inputScore() {
		System.out.println("View 입니다.");
		return scan.nextInt();
	}
	
	public void printGrade(String s) {
		System.out.println("View 입니다.");
		System.out.println("--------------------------");
		System.out.println("당신의 학점은 " + s);
		System.out.println("--------------------------");
	}
}
 

위 코드를 보면 멤버변수의 선언 없이 오직 입력과 출력만 담당한다는 것을 볼 수 있다.

 

2. Controller

package com;

public class Controller {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("controller 입니다.");
		InputClass input = new InputClass();
		Processing proc = new Processing();
		input.printGrade(proc.grade(input.inputScore()));
	}
}
 

Controller 부분이다.

Controller에는 main 메소드에서 인스턴스를 생성 하여 메소드를 호출하고 매개변수를 전달하는 것을 볼 수 있다.

즉 처리에 대한 흐름 제어를 하는 부분이다.

 

3. Model

package com;

public class Processing {
	
	public String grade(int a) {
		int score = a/10;	
		String str = null;
		System.out.println("Model 입니다.");
		
		switch(score) {
		case 10:
		case 9:
			str = "A 입니다.";
			break;
		case 8:
			str = "B 입니다.";
			break;
		case 7:
			str = "C 입니다.";
			break;
		case 6:
			str = "D 입니다.";
			break;
		default:
			str = "F 입니다.";
			break;
		}
		return str;
	}
}
 

Model 에서는 View에서 입력된 값을 Controller 에서 인자로 전달받아 분기를 처리하는 모습이다.

처리 후 값을 return 하여 Controller로 전달 뒤 Controller 에서 다시 View로 전달하여 값을 출력하게 된다.

(프로그램에서는 101 이상 || 0 점 이하를 처리하진 않았다..)

 

 

실행화면을 보면 MVC 가 각각 자신임을 표시하고 있다.

 

'JAVA' 카테고리의 다른 글

배열 / foreach 사용  (0) 2022.08.28
import  (0) 2022.08.28
Package  (0) 2022.08.28
접근 제어자  (0) 2022.08.28
변수  (0) 2022.08.28

 

C++과 JAVA에서는 클래스를 만들어 프로그램을 제작한다.

하지만 만들어진 인스턴스에 다른 작업에서 접근하여 클래스 내부를 수정하게 되면 큰 문제가 발생할 수 있다.

하지만 C++ / JAVA 인스턴스 변수 또는 메소드에 접근을 제어하는 접근 제어자를 설정할 수 있다. 이를 통해

클래스의 캡슐화(정보은닉) 을 실현할 수 있다.

 

JAVA의 접근 제어자에는 4종류가 있다.

 

1. public

다른 클래스에서 생성한 인스턴스를 통해 제한 없이 멤버에 접근하여 사용할 수 있는 제어자.

단, static 멤버의 경우는 인스턴스 없이도 접근 가능

 

2. default (package - private)

같은 패키지에서만 접은을 허용하는 제어자.

접근 제어자를 별도로 정해주지 않는다면 기본으로 적용된다.

즉, void func() 는 default void func() 과 같은 의미다.

 

3. protected

같은 패키지, 다른 패키지여도 상속받은 하위 클래스에서는 사용할 수 있는 제어자.

※ protected를 이해하기 위해서는 상속에 대한 이해가 필요하므로 추후 상속에서 다루기로 한다.

 

4. private

클래스 내부에서만 접근하여 사용할 수 있도록 하는 제어자.

 

위의 순서는 접근이 가능한 범위가 넓은 순으로 작성하였다. 즉, public 으로 선언된다면 인스턴스를 통해

어디서나 접근이 가능하며 반대로 private 로 선언된다면 클래스 외부에서는 접근이 불가능하다.

 

접근 제어 가능한 범위

<소스 코드>

점수를 입력받아 합격 여부 및 A ~ F 로 변환해주는 프로그램이다.

자세한 설명은 주석을 참고한다.

 

package com;
import java.util.Scanner;
public class Branch {
	/* 점수 입력 받아서 합격 불합격 처리용 클래스 */
	private int score;		
	
	void inputScore() {	// 접근제어자가 없으므로 default 로 선언됨
		Scanner scan = new Scanner(System.in);
		score = scan.nextInt();
	}
	
	private void printPass() {	// private 메소드 선언
		if(score >= 60) System.out.println(score+" : 합격 ");
		else 	System.out.println(score+" : 불합격 ");
	}
	
	private void printGrade() {
		if(score >= 90) System.out.println(score+" : A ");
		else if(score <= 89 && score >= 80) System.out.println(score+" : B ");
		else if(score <= 79 && score >= 70) System.out.println(score+" : C ");
		else if(score <= 69 && score >= 60) System.out.println(score+" : D ");
		else if(score <= 59 ) 	System.out.println(score+" : F ");
		else 	System.out.println(score+" 는 잘못된 값입니다. ");
	}
	
	public void playBranch() { // private로 선언된 메소드에 접근할 수 있는 public형 메소드
		inputScore();
		printPass();
		printGrade();
	}
}
 
package com;
public class UseClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Branch bc = new Branch();	// 인스턴스 생성
		bc.playBranch();
	}
}
 

실행 화면

 

'JAVA' 카테고리의 다른 글

배열 / foreach 사용  (0) 2022.08.28
import  (0) 2022.08.28
Package  (0) 2022.08.28
MVC 패턴  (0) 2022.08.28
변수  (0) 2022.08.28

+ Recent posts