고래씌

[JAVA] 7-1. 클래스(Class) 본문

JAVA/JAVA 기초

[JAVA] 7-1. 클래스(Class)

고래씌 2023. 10. 12. 14:45

+ : public
- : private
# : protected
~ : default(package)
 

- 클래스 실습 예제

package com.kh.example.practice1.model.vo;

public class Member {
	// 필드부
	private String memberId;
	private String memberPwd;
	private String memberName;
	private int age;
	private char gender;
	private String phone;
	private String email;
	
	// 생성자부
	// + Member()
	public Member () {
		
	}
	
	// 메소드부
	public void changeName(String name) {
		memberName = name;
	}
	
	public String printName() {
		return memberName;
	}
}
package com.kh.example.practice1.run;

import com.kh.example.practice1.model.vo.Member;

public class Run {

	public static void main(String[] args) {
		Member student = new Member();
		
		student.changeName("abcd");
		System.out.println(student.printName());
	}
}

 

1.  클래스

- 클래스 선언 구문에 사용가능한 접근제한자 : public, default
- public으로 선언을 해야 다른 패키지에서 접근이 가능
- default로 설정한 경우 같은 패키지에서만 접근 가능

=> 하지만, 클래스 안에 여러개의 클래스가 있을 순 있지만, public 클래스는 단 한개만 존재하여야 한다!
 

package com.kh.chap03_class.model.vo;

public class Product { // 클래스 선언부

	// 필드부
	// 상품명, 상품가격, 브랜드
	private String pName;   
	private int price;
	private String brand;
	
	
	// 생성자부
	public Product() {
		
	}
	
//	public void Product () (X) void 붙은 것은 메소드부이다!
	
	
	// 메소드부 (set/get) + information
	public void setPrice(int price) {
		this.price = price;
	}
	
	public void setBrand(String brand) {
		this.brand = brand;
	}
	
	public void setpName(String pName) {
		this.pName = pName;
	}
	
	
	// 모든 필드값을 출력해주는 information 메소드
	public void information() {
		System.out.println("상품명 : " + pName + ", 가격 : " + price + "원, 브랜드 : " +brand );
	}
	
}
package com.kh.chap03_class.run;

import com.kh.chap03_class.model.vo.Product;

public class Run {

	public static void main(String[] args) {
		Product p = new Product();
		p.setpName("갤럭시 s20");
		p.setPrice(600000);
		p.setBrand("삼성");
		
		Product p2 = new Product();
		p2.setpName("z플립5");
		p2.setPrice(1000000);
		p2.setBrand("삼성");
		
		p.information();
		p2.information();
		
	}
}

 

2. 전역변수, 지역변수

1) 변수 구분

  ▶ 전역변수 : 클래스 영역에 바로 선언하는 변수 → 클래스 내에서면 어디서든 사용 가능
  ▶ 지역변수 : 클래스 영역 내의 특정 중괄호 영역에 선언한 변수(선언한 영역에서만 사용 가능)
   ex) 메소드 영역, if문 영역, for문 영역...
 

2) 전역변수(가지로 구분됨)

- 필드 == 인스턴스 변수 == 멤버변수
  ▶ 생성시점 : new 연산자를 통해 해당 객체가 생성하는 순간 메모리 영역에 할당.
  ▶ 소멸시점 : 객체 소멸시 필드도 함께 소멸
 
- static 변수 == 클래스변수 : static 이라는 예약어가 붙어있냐 아니냐에 따라 필드냐, static 변수냐로 구분됨
ex) private static int global;    ☞ static 변수
      private int global;    ☞ static 변수 X
  ▶ 생성시점 : 프로그램 실행과 동시에 메모리영역(static 영역)에 할당
  ▶ 소멸시점 : 프로그램이 종료될 때 소멸
=> 자주 사용하는 변수는 static 변수로 만들어주는 것이 좋음!
 

3) 지역변수

▶ 생성시점 : 프로그램을 실행하다가 특정 중괄호 구역을 만났을 때 메모리 영역에 할당(stack)
▶ 소멸시점 : 중괄호 구역이 끝났을 때 소멸
 

package com.kh.chap04_field.model.vo;

public class FieldTest1 {
	
	// 변수 선언위치에 따른 구분(전역변수, 지역변수)
	
	// 전역변수(필드)
	private int global;

	public void  test(int num) {
		// 매개변수 ==> 지역변수
		
		// 지역변수(메소드 영역 내에 생성) => 지역변수에는 접근제한자를 붙일 수 없다.
		int local = 100; // 지역변수에는 항상 값을 초기화 시켜줘야 한다.
		
		if(true) {
			int a = 0;  // 지역변수    // a => 값을 초기화 해두지 않으면 에러가 발생.
			System.out.println(a); // 0
		}// int a 소멸;
		
		System.out.println(global);   // 에러발생 X . 전역변수로 new 연산자를 통해 메모리 영역에 할당을 해줘서
		
		System.out.println(num);     // 에러발생 X . 
		// 반드시 매개변수로 넘겨줘야지만 매개변수를 호출할 수 있는데 run 클래스에서 값을 넣어서 호출하기 때문. 매개변수에 항상 값이 들어간 상태이기 때문
		
		System.out.println(local);  // 값을 초기화해두지 않으면 에러가 발생.
	}
}
package com.kh.chap04_field.run;

import com.kh.chap04_field.model.vo.FieldTest1;


public class Run {

	public static void main(String[] args) {
		FieldTest1 ft = new FieldTest1();   // -> global 전역변수가 할당
		ft.test(100);  // test 메소드 호출시 매개변수로 100값을 전달함(지역변수 num, local 생성)
		               // 메소드 종료시 num, local 소멸
	}
}

System.out.println(global);
=> 필드에 값을 초기화하지 않아도 에러가 발생하지 않는 이유
     필드의 생성시점은 객체의 생성시점과 동일하며, 객체생성시 초기화 되진 않은 필드들은 JVM이 자동으로 기본값을 대입해 줬기 때문에 항상 값이 들어가 있다.
 
System.out.println(num);
=> num에는 반드시 어떤 값이든 들어가 있기 때문
 

3. 접근제한자

(+) public         => 어디서든 접근 가능(같은패키지 + 다른패키지)
(#) proteted     => 같은패키지에서만 접근 가능. 단, "상속"구조라면 다른패키지에서도 가능
(~) default       => 오직 같은 패키지에서만 접근 가능
(-) private        => 오직 해당 클래스에서만 접근 가능
 
위에서부터 아래로 내려갈수록 접근할 수 있는 범위가 좁아진다.
public > proteted > default  > private

package com.kh.chap04_field.model.vo;

public class FieldTest2 {
	
	public String pub = "public";
	protected String pro = "protected";
	String df = "default";
	private String pri = "private";
	

}
package com.kh.chap04_field.run;

import com.kh.chap04_field.model.vo.FieldTest1;
import com.kh.chap04_field.model.vo.FieldTest2;


public class Run {

	public static void main(String[] args) {
		
		FieldTest2 ft2 = new FieldTest2();
		
		// public -> 어디서든 가능
		System.out.println(ft2.pub);
		
		//protected -> 같은패키지에서만 접근가능
		System.out.println(ft2.pro);  // 다른 패키지에 있어서 에러 발생 protected.
		
		// default -> 같은패키지에서만 접근가능
		System.out.println(ft2.df);   // 에러 발생
		
		// private
		System.out.println(ft2.pri);  // 에러 발생
	}
}
package com.kh.chap04_field.model.vo;

public class Test {

	public static void main(String[] args) {
		FieldTest2 ft2 = new FieldTest2();
		System.out.println(ft2.pub);
		System.out.println(ft2.pro);   // 같은 패키지 내부에 있어서 접근 가능. protected
		System.out.println(ft2.df);
		System.out.println(ft2.pri);  // 에러 발생
	}

}

 

4. static변수(클래스변수)와 상수필드(static final)

1) static 변수(클래스 변수)

- static "공유"의 개념이 강함 => 프로그램 실행과 동시에 메모리 영역에 데이터를 공유를 해서 쓰자!
- 자주 사용되는 변수, 메소드를 statice으로 선언함
▶ 생성시점 : 프로그램 실행과 동시에 메모리의 static 영역에 할당됨 => 객체를 생성하지 않아도 할당됨.
소멸시점 : 프로그램 종료시
 

2) 상수필드

public static final 자료형 변수명 = 값;
한번 지정된 값을 고정해서 사용하기 때문에 무조건 초기화를 해줘야 함.
 
☞ static : 공유의 개념
     final : 상수의 개념
 
값이 변경되서는 안되는 고정적인 값을 메모리상에 올려두고 공유하면서 사용할 목적으로 사용함
★ 상수필드명은 항상 모든 글자가 대문자

package com.kh.chap04_field.model.vo;

// static변수(클래스변수)와 상수필드(static final)
public class FieldTest3 {
	
	// 접근제한자 [예약어] 자료형 변수명;
	public static int num = 100;
	
	
	public static final int NUM=9;
	
	
	public static void test() {
		System.out.println("안녕");
	}
}
package com.kh.chap04_field.run;

import com.kh.chap04_field.model.vo.FieldTest1;
import com.kh.chap04_field.model.vo.FieldTest2;
import com.kh.chap04_field.model.vo.FieldTest3;


public class Run {

	public static void main(String[] args) {

		FieldTest3 ft3 = new FieldTest3();

		System.out.println(Math.E);
		
//		System.out.println(FieldTest3.test());
		FieldTest3.test();
		
	}
}

5. 클래스 실습 예제

package com.kh.example.practice3.model.vo;

public class Circle {
	
	private static final double PI = 3.14;
	private static int radius = 1;
	
	public Circle() {
		
	}
	
	public void incrementRadius() {
		radius++;
	}
	
	public void getAreaOfCircle() {  // 둘레
		// 2 * 파이 * 반지름
		System.out.println(2 * radius * PI);
	}
	
	public void getSizeOfCircle() {  // 넓이
		// 반지름 * 반지름 * 파이
		System.out.println(2 * radius * PI);
	}
}
package com.kh.example.practice3.run;

import com.kh.example.practice3.model.vo.Circle;

public class Run {

	public static void main(String[] args) {
		
		Circle cc = new Circle();

		cc.getAreaOfCircle(); // 둘레
		cc.getSizeOfCircle(); // 넓이
		
		cc.incrementRadius();
		cc.getAreaOfCircle(); // 둘레
		cc.getSizeOfCircle(); // 넓이
	}
}

'JAVA > JAVA 기초' 카테고리의 다른 글

[JAVA] 7-3. 메소드(Method)  (0) 2023.10.12
[JAVA] 7-2. 생성자  (0) 2023.10.12
[JAVA] 배열까지 종합문제  (0) 2023.10.12
[JAVA] 7. 객체(추상화, 캡슐화)  (0) 2023.10.11
[JAVA] 6. 2차원 배열  (0) 2023.10.11