본문 바로가기
Spring-Java/Java

Day07_접근제한자, class(필드, 생성자, 메소드)

by 현대타운301 2023. 8. 23.

2023.08.22

 

Day07 세 줄 요약

- 접근제한자에 따라서 접근권한이 달라진다 (public, default, private, ...)

- class는 '필드', '생성자', '메소드'로 구성된다

- class를 통해 특정 객체를 생성하고 호출할 수 있다

 


접근제한자

 

접근제한자

해당 class의 접근 권한을 설정

호출할 수 있는 범위를 제한하는 역할

 

public

다른 package에서도 사용 가능

접근 권한이 가장 넓음

 

default

같은 package 내부에서만 사용가능

접근제한자가 없는 경우, 자동으로 'default'로 지정

 

private

같은 class 내부에서만 사용가능

private 필드에 값을 저장하거나 가져올 때는 '메소드'를 사용해야 함 

          - 보편적으로 값을 저장할 때는 set___, 값을 받아올 때는 get___

 

 


class(Variable / Constructor / Method)

 

class Fruit

package day07;

public class Fruit {

	// 필드
	String name; // 과일이름
	String color; // 과일색
	boolean isSeed; // 씨앗 유무

	// 생성자
	public Fruit() {

	}
	
	public Fruit(String name) {
		this.name = name;
	}
	
	public Fruit(String name, String color) {
		this.name = name;
		this.color = color;
	}
	
	public Fruit(String name, String color, boolean isSeed) {
		this.name = name;
		this.color = color;
		this.isSeed = isSeed;
	}

	// 메소드
	public void print() {
		System.out.printf("%s\t%s\t%b\n", name, color, isSeed);
	}

	public String print1() {
		String str = "과일이름 : " + name;
		str += ", 과일색 : " + color;
		str += ", 씨유무 : " + isSeed;
		return str;
	}

}

 

class FruitMain

package day07;

public class FruitMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Fruit apple = new Fruit();
		apple.name = "사과";
		apple.color = "빨강";
		apple.isSeed = true;
		apple.print();
		System.out.println(apple.print1());
					
		Fruit melon = new Fruit("메론");
		melon.color = "초록";
		melon.isSeed = true;
		melon.print();
		
		Fruit orange = new Fruit("오렌지", "주황");
		orange.isSeed = true;
		orange.print();
		
		Fruit banana = new Fruit("바나나","노랑",false);
		banana.print();
		
		// 세 번째 생성자를 사용하여 귤(mandarin) 객체 만들고 print
		Fruit mandarin = new Fruit("귤","주황");
		mandarin.isSeed = false;
		mandarin.print();
		
		// 두 번째 생성자를 사용하여 포도(grape) 객체 만들고 print
		Fruit grape = new Fruit("포도");
		grape.color = "보라";
		grape.isSeed = true;
		grape.print();
	}
}

 

실행결과

사과	빨강	true
과일이름 : 사과, 과일색 : 빨강, 씨유무 : true
메론	초록	true
오렌지	주황	true
바나나	노랑	false
귤	주황	false
포도	보라	true

 

class(필드 / 생성자 /  메소드)

 

필드(인스턴스변수 or 멤버변수)

해당 class에서 사용할 변수

 

default의 경우

String name;          // (객체명).name = "___"; 와 같이 사용

 

private의 경우

private 필드의 경우, 메소드를 통해서 값을 저장하고 불러옴

private String name;          // (객체명).name = "___"; 와 같이 사용 불가

 

 


class(필드 / 생성자 /  메소드)

 

생성자(constructor)

객체 생성과 동시에 호출되는 필수 요소

생성자의 이름은 반드시 class 이름과 동일하며, return type이 없는 것이 특징

 

class 선언 시 따로 정의하지 않으면 기본으로 'default' 생성자로 인식

만약 특정 매개변수를 받는 생성자를 정의하면 default를 사용할 수 없어짐

          - 이러한 경우에는 default 생성자 또한 함께 정의해줘야 사용가능

 

// 생성자_1 default 생성자
public Fruit() {

}

// 생성자_2 매개변수를 받는 생성자
public Fruit(String name, String color, boolean isSeed) {
	this.name = name;
	this.color = color;
	this.isSeed = isSeed;
}

 


class(필드 / 생성자 /  메소드)

 

메소드

기능을 수행하고자 할 때 사용

'접근제한자 + return타입 + 메소드이름()' 형식으로 구성

return타입을 정의할 경우, 해당 메소드 안에 반드시 같은 타입의 return 값이 필요

public String print1() {
	String str = "과일이름 : " + name;
	str += ", 과일색 : " + color;
	str += ", 씨유무 : " + isSeed;
	return str;
}

 

void return type

빈 공간을 뜻하며 return 값이 필요 없음

          - 값을 입력해 변수에 저장하거나, 계산을 수행하거나, ... 등

public void print() {
	System.out.printf("%s\t%s\t%b\n", name, color, isSeed);
}

 

Getters, Setters

접근제한자가 private의 경우, 접근 권한이 같은 class로 제한되기 때문에 메소드를 통해 값을 변수에 저장하고 불러옴

변수에 값을 입력 및 저장 (set) 하고, 특정 변수 값을 불러옴 (get)

package day08;

public class User {
	// 필드
	private String name;
	private String id;
	private String pw;
	private String date;
	
	// 생성자
	public User() {
		
	}
	public User(String name, String id, String pw) {
		this.name = name;
		this.id = id;
		this.pw = pw;
	}
	
	// 메소드
	// Getters, Setters
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getId() {
		return id;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	public String getPw() {
		return pw;
	}
	public void setDate(String date) {
		this.date = date;
	}
	public String getDate() {
		return date;
	}
	
	// print 메소드
	public void print() {
		System.out.printf("%s\t%s\t%s\t%s\n", name, id, pw, date);
	}
}

 

자동완성

자주 쓰이기 때문에 Eclipse에서 자동완성 기능을 제공

단, 필드(변수)가 먼저 선언된 상태여야 함

 

typing으로 생성하기

" Alt -> s -> r -> (Art + a ) -> (Art + r) "

public class User {
	// get,set 메소드 자동생성 결과
	String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

 

 


 

Java 기초

 

type별 default value

int : 0

String : null

boolean : false

 

System.___.print()

___ = err, 빨간 색으로 출력문 작성 (syserr)

          - 특정 상황에 error 문구를 출력할 때 사용할 수 있음

___ = out, 기본 색으로 출력문 작성 (sysout)

 

namespace

Java는 block 단위로 변수가 저장됨

큰 블럭에서 선언 후 그 안에 귀속된 작은 블럭에서 다시 선언할 수 없음

          - int b = 9;                    // 큰 블럭에서 int b = 9로 선언

          - if (a > 0) {

          -           int b = 4;          // 작은 블럭에서 int b = 4로 다시 선언 불가

          - }

 

객체자향언어 Java

Java에서는 class를 객체로 선언하고 호출할 수 있음

객체지향의 가장 큰 장점은 '재사용성', 각 제한자에 맞는 범위에서 자유롭게 호출해서 사용가능

 

단축키

Ctrl + n + "java package" = 패키지 생성

Ctrl + n + "java class" = 클래스 생성


 

예제

 

source code

// Student class (필드, 생성자, 메소드)
package day07;

public class Student {

	// 필드
	private String no;
	private String name;
	private String dept;
	private int year;
	
	// 생성자
	public Student() {
		
	}
	
	public Student(String no, String name, String dept, int year) {
		this.no = no;
		this.name = name;
		this.dept = dept;
		this.year = year;
	}
	
	// 메소드
	public void setNo(String no) {
		this.no = no;
	}
	public String getNo() {
		return no;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setDept(String dept) {
		this.dept = dept;
	}
	public String getDept() {
		return dept;
	}
	public void setYear(int year) {
		this.year = year;
	}
	public int getYear() {
		return year;
	}
	

	public void print() {
		System.out.printf("%s\t%s\t%s\t%d\n", no, name, dept, year);
	}
}
// Student main class
package day07;

import java.util.Scanner;

public class StudentMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
        // 학사관리시스템
		Scanner sc = new Scanner(System.in);
		Student[] list_1 = new Student[10];
		Student[] list_2 = new Student[10];
		int cnt = 0;
		
		while (true) {
			System.out.println("==========학사관리시스템==========");
			System.out.println("1.학생등록 2.학생리스트 3.학생조회 0.종료");
			System.out.print("메뉴선택 > ");
			int menu = sc.nextInt();
			
			if (menu == 1) {
				Student s = new Student();
				// 중복학번을 걸러내기위한 while문
				while (true) {
					int j = 0;
					System.out.print("학번입력 > ");
					String inputNo = sc.next();
					for (int i = 0; i < cnt; i++) {
						if (list_1[i].getNo().equals(inputNo)) {
							System.out.println("중복된 학번이 있습니다...");
							System.out.println("다시 입력하세요");
							j++;
						}
					}
					if (j == 0) {
						// 중복된 학번이 없으면 입력받은 학번(inputNo)을 객체(s)에 저장
						s.setNo(inputNo);
						break;
					}
				}
				System.out.print("이름입력 > ");
				s.setName(sc.next());
				System.out.print("학과입력 > ");
				s.setDept(sc.next());
				System.out.print("학년입력 > ");
				s.setYear(sc.nextInt());
				// Student 배열 'list[]'에는 Student 객체 's' 만 담을 수 있다
				list_1[cnt] = s;		
				System.out.println(s.getName()+" 학생 등록 완료!");
				cnt++;
			} else if (menu == 2) {
				// 학생리스트 조회 시 학년순으로 정렬
				int j = 0;
				for (int i = 0; i < cnt; i++) {
					j = i + 1;
					if (j == cnt) {
						j--;
					}
					for (; j < cnt; j++) {
						if (list_1[i].getYear() > list_1[j].getYear()) {
							list_2[i] = list_1[j];
							list_1[j] = list_1[i];
							list_1[i] = list_2[i];
						}
					}
				}				
				System.out.println("학번\t이름\t학과\t학년");
				System.out.println("=============================");
				for (int i = 0; i < cnt; i++) {
					// print 메소드를 사용해서 출력
					list_1[i].print();
				}
			} else if (menu == 3) {
				int j = 0;
				System.out.print("조회할 학번 > ");
				String inputNo = sc.next();
				for (int i = 0; i < cnt; i++) {
					if(list_1[i].getNo().equals(inputNo)) {
						System.out.println("학번\t이름\t학과\t학년");
						System.out.println("=============================");
						list_1[i].print();
						j++;
					}
				} if (j == 0) {
					System.out.println("조회할 수 없는 학번입니다...");
				}
			} else if (menu == 0) {
				System.out.println("프로그램을 종료합니다...");
				break;
			} else {
				System.out.println("0~3까지만 입력하세요...");
			}
			System.out.println();
		}
		sc.close();
	}
}

 

실행결과

==========학사관리시스템==========
1.학생등록 2.학생리스트 3.학생조회 0.종료
메뉴선택 > 1
학번입력 > 2014
이름입력 > 홍길동
학과입력 > 전자
학년입력 > 4
홍길동 학생 등록 완료!

==========학사관리시스템==========
1.학생등록 2.학생리스트 3.학생조회 0.종료
메뉴선택 > 1
학번입력 > 2014
중복된 학번이 있습니다...
다시 입력하세요
학번입력 > 2013
이름입력 > 이순신
학과입력 > 전자
학년입력 > 2
이순신 학생 등록 완료!

==========학사관리시스템==========
1.학생등록 2.학생리스트 3.학생조회 0.종료
메뉴선택 > 1
학번입력 > 2015
이름입력 > 김전자
학과입력 > 경영
학년입력 > 3
김전자 학생 등록 완료!

==========학사관리시스템==========
1.학생등록 2.학생리스트 3.학생조회 0.종료
메뉴선택 > 1
학번입력 > 2016
이름입력 > 아이유
학과입력 > 간호
학년입력 > 1
아이유 학생 등록 완료!

==========학사관리시스템==========
1.학생등록 2.학생리스트 3.학생조회 0.종료
메뉴선택 > 2
학번	이름	학과	학년
=============================
2016	아이유	간호	1
2013	이순신	전자	2
2015	김전자	경영	3
2014	홍길동	전자	4

==========학사관리시스템==========
1.학생등록 2.학생리스트 3.학생조회 0.종료
메뉴선택 > 3
조회할 학번 > 2011
조회할 수 없는 학번입니다...

==========학사관리시스템==========
1.학생등록 2.학생리스트 3.학생조회 0.종료
메뉴선택 > 3
조회할 학번 > 2016
학번	이름	학과	학년
=============================
2016	아이유	간호	1

==========학사관리시스템==========
1.학생등록 2.학생리스트 3.학생조회 0.종료
메뉴선택 > 5
0~3까지만 입력하세요...

==========학사관리시스템==========
1.학생등록 2.학생리스트 3.학생조회 0.종료
메뉴선택 > 0
프로그램을 종료합니다...

 

'Spring-Java > Java' 카테고리의 다른 글

Day09_Overloading, 정적변수, for/each  (0) 2023.08.28
Day08_ArrayList<>, DateTimeFormatter  (0) 2023.08.24
Day06_배열예제2  (0) 2023.08.21
Day05_배열예제  (2) 2023.08.20
Day04_while(boolean), 배열(Array)  (0) 2023.08.17