[JAVA.08] 클래스의 기초와 클래스패스 그리고 스태틱의 이해⭐

Kama_Code·2023년 7월 12일
1

JAVA

목록 보기
13/20
post-thumbnail
post-custom-banner
  • 자바(Java)는 클래스이다! 해도 과언이 아닌 만큼 굉장히 중요한 파트이다.
    오늘은 클래스의 기초를 배운다. 추후에 클래스에 대해 다시 깊이 다룰 것이다.

<Step.1> 객체지향 프로그래밍(Object Oriented Programming)

  • 데이터를 추상화시켜 속성과 행위를 가진 객체를 만들고
    그 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법

▶ 우리가 표현할 수 있는 실제 세계의 모든 사물들을 객체(오브젝트Object) 라고 한다.
▶ 객체 만들기를 인스턴스(Instance)화 한다.

<Step.2> 클래스의 기초(Class)

  • 자바(JAVA)는 클래스가 전부이다.
  • 클래스는 데이터와 처리동작을 하나로 모아놓은 것이다.
  • 데이터를 필드, 처리동작을 메소드라고 한다.
  • 필드와 메서드를 클래스의 멤버라고 한다.
  • ★★ 객체지향 프로그래밍에서는 큰 하나의 클래스보다
    작은 열개의 클래스가 더 큰 힘과 위력을 발휘한다.

========== 규칙 ==========

  • 클래스 이름은 대문자로 시작
  • 하나의 java파일에 여러개의 클래스를 정의 가능하다
  • 단, 소스 파일 1개당 public 클래스 선언은 단 하나만 가능하다.
  • 자바 파일명과 public 클래스명은 동일해야함 and 패키지는 폴더명과 일치

<Step.3> 객체 만들기(인스턴스화)

Book(클래스 타입) myBook 주소값(참조값) = new (객체생성) Book(); (생성자)

  • new는 무조건 힙 영역에 저장된다. 스택 영역은 기본 자료형 저장

<Step.4> 생성자(constructor)

  • 생성자(constructor)란 객체 생성을 할 때만 호출하는 특수한 메서드
  • 생성자 이름은 클래스 이름하고 똑같다.
  • 메소드이지만 반환형이 없는 형태이다.

⚡ 디폴트 생성자(Default Constructor)

  • 클래스는 반드시 하나 이상의 생성자가 존재
  • 개발자가 생성자를 정의하지 않으면 컴파일러에 의해 디폴트 생성자가 코드에 삽입
  • 매개변수와 실행부가 없는 형태로 정의
  • 생성자는 클래스명과 동일
  • 주로 멤버변수 초기화에 사용
  • 멤버상수를 초기화 할 수 있다.
  • 상속되지 않는다.
  • 리턴값이 없다. 즉 값을 반환할 수 없다.
  • 객체 생성시 딱 한번만 호출되고, 개발자가 임의로 호출할 수 없다.
  • 메소드 오버로딩이 가능하다.
  • 생성자 내에서 다른 생성자를 호출할 수 있다.

<Step.5> 생성자 오버로딩(Constructor overloding)

  • 하나의 클래스 내에 매개변수 개수나 자료형이 다른 동일한 이름의
    메소드를 여러개 정의하는 것
  • 매개변수의 개수, 타입을 다르게 기술하여 여러개를 정의할 수 있다.
  • 오버로딩이 된 생성자가 있으면 디폴트 생성자를 무조건 만들어야 한다.
    ( 가장 순수한 생성자가 무엇인지 기준을 알아야 하므로 )

<Step.6> 접근 제한자

  • 변수나 메서드에 접근 제한자를 지정하면 접근을 제한할 수 있다.
  • 데이터의 안정을 위해 // 권한이 있는 사람만 볼 수 있다

정보은닉화(private)을 많이 사용한다.
단, 정보은닉화를 하게 되면 메소드 호출할시 getter(출력) setter(입력)을 만들어서
간접으로 호출해야 한다.

💧 getter & setter 생성법
get set은 우클릭 - source - general getter and setter로 자동 생성 가능

<Step.7> this의 사용

변수마다 이름을 각각 정의하는 것은 생각보다 쉽지 않다. 그래서
보통은 같은 이름을 사용하는데 멤버변수임을 구분해주는 데 this를 사용한다.

<Step.8> 디버깅

main > 번호 줄 우크릭 > toggle breakpoint
ㄴ 오류 체크할 때 좋다
ㄴ 다음줄 넘어가는 것 (Step over)
ㄴ 메소드 안으로 들어가는 것 (Step into)

<Step.9> 스태틱(static)

  • 스태틱 영역의 변수 및 메서드는 어떤 객체에서도 접근해서 사용할 수 있다.
  • 그래서 스태틱을 전역변수라고도 불리운다.
  • main 보다도 먼저 실행된다.
  • 하나만 선언이 가능하다.
  • 특정 기능이 필요한데 자주 사용된다면 많은 클래스에서 중복되어 만들어 지지 않게 하려는 의도에서 스태틱을 많이 사용한다. .
  • 스태틱(static)의 특징
  1. 메모리에 고정적으로 할당된다.
  2. 객체 생성 없이 사용할 수 있다.
  3. 프로그램이 시작되면 메모리의 static 영역에 적재되고, 프로그램이 종료될 때 해제된다.
  4. Static 메서드 내에서는 인스턴스 변수를 사용할 수 없다.

<Step.10> 패키지와 클래스패스

  • JVM(자바 가상 머신)이 클래스를 실행시키는 방법
    ㄴ같은 폴더에서 클래스 파일을 찾아서 기억한다.
    ㄴ경로를 지정했다면 그 경로에 있는 클래스 파일을 찾아서 실행한다.
    ㄴJava.class - 실행(확장자가 class여야 실행이 가능하다.)
  • 패키지는 폴더명과 같다.(폴더 이름은 소문자로 구성한다)
    ㄴ .은 안에 있는 폴더를 의미한다. 예시) com.study
  • 클래스패스는 자바 가상머신의 클래스 탐색 경로를 의미한다.
  • java.lang 패키지만 예외적으로 임포트가 필요 없이, 클래스 이름만 적어서 사용할 수 있다.
  • 클래스 이름이 같아서 충돌이 일어나는 경우가 아니라면 왠만하면 import해서 사용한다.

cmd (명령 프롬프트) 기초 명령어
1. cd + "주소" : cd는 들어간다를 의미한다.
2. dir : 목록 보기

<Step.11> 발전을 위한 문제풀이 (kama_code 출제)

  1. 밑변과 높이 정보를 저장할 수 있는 Triangle클래스를 정의해보자.
    init메소드를 통해 밑변과 높이를 초기화한다.
    그리고 밑변과 높이를 변경시킬수 있는 메소드와 삼각형의 넓이를 계산해서 반환하는 메소드도 함께 정의해보자.
  2. 구슬치기 하는 아이들을 추상화하여 클래스로 정의해보자.
    어린아이가 보유하고 있는 구슬의 개수 정보를 담는다
    놀이를 통해 구슬을 획득 또는 상실하는 것을 표현한다.
    *어린이의 현재 보유하고 있는 구슬의 개수를 표현한다.
    초기화는 다음과 같이 진행한다.
    ◆어린이1의 보유갯수 : 구슬 20개
    ◆어린이2의 보유갯수 : 구슬 15개
    게임은 다음과 같이 진행한다.
    ◆1차게임 : 어린이1은 어린이2의 구슬 5개를 획득한다.
    ◆2차게임 : 어린이2는 어린이1의 구슬 9개를 획득한다.
    ㄴ어린이 객체를 생성시 구슬의 보유갯수는 생성자를 통해 초기화 되어야 한다.
  3. 성적 클래스를 작성해보자. 국어,영어, 수학 과목의 3개의 점수를 입력받아
    객체를 생성하고 성적 평균을 출력하는 프로그램을 만들어라.

★ 정답 및 해설 ☆

  1. 여기서 핵심은 다양한 메소드를 위 아래로 왔다갔다를 잘하는 것이다.
    메소드 이름을 컨트롤+좌클릭 하면 그 메소드로 이동한다.
    private는 직접 접근이 안되므로 getter setter을 만들어줘서 다뤄야 하며,
    멤버 메소드를 별도로 만들어줌으로써 간접적으로 불러오는 방법도 있다.
    (단, 반드시 클래스 Triangle 안에 모두 넣어줘야 한다.)
    그리고 getArea를 통해 계산을 하는 메소드를 만들어준다.
    (단, 0.5라는 소수를 다루므로 double형으로 반환해야 오류가 나지 않는다)
import java.util.Scanner;

class Triangle
{
	//멤버변수 : 밑변, 높이
	/*
	멤버변수의 직접적인 접근을 차단하기 위해 private으로 선언하는 것을
	정보은닉이라고 한다
	 */
	private int bottom;
	private int height;
	
	//멤버 메서드
	//멤버 변수 전체를 초기화 한다
	public void init(int _bottom, int height)
	{ // private을 간접적으로 불러오기 위해 해당 메소드를 만든다
		
		//매개변수와 멤버변수명이 다르므로 혼선이 없기에 this가 없어도 된다
		bottom = _bottom;
		//this는 멤버변수를 가리키는 키워드이다. height은 
		//Triangle의 멤버변수와 일치하기에 this를 붙여서 구분해준다.
		this.height = height;			
	}
	
	// 우클릭 소스 - getter, setter를 누른다 - setter만 생성한다.
	// private이므로 간접적으로 접근하기 위해 필요하다.
	public void setBottom(int bottom)
	{
		this.bottom = bottom;
	}

	public void setHeight(int height)
	{
		this.height = height;
	}
	
	/*
	삼각형의 넓이는 밑변*높이*0.5 이므로 계산의 결과가 소수점으로 나올 수 있다
	따라서 int가 아닌 double형으로 설정해주어야 한다.
	 */
	public double getArea(int bottom2, int height2)
	{
		return bottom2 * height2 * 0.5;
	}
	
}

public class ClassOne
{
	
	public static void main(String[] args)
	{
		/*
		1. 밑변과 높이 정보를 저장할 수 있는 Triangle클래스를 정의해보자. 
		init메소드를 통해 밑변과 높이를 초기화한다.
		*/
		Triangle t = new Triangle(); //Triangle을 불러와준다. t라는 객체로 담는다.
		Scanner scan = new Scanner(System.in); // 사용자로부터 입력값을 받는다.
		System.out.println("밑변은 몇인가요? : ");
		int bottom = scan.nextInt(); // bottom(밑변)으로 저장
		System.out.println("높이은 몇인가요? : ");
		int height = scan.nextInt(); // height(높이)로 저장
		t.getArea(bottom, height); // t클래스 객체에 포함된 getArea를 호출해서 밑변과 높이를 보낸다.
		System.out.println("삼각형의 넓이 : "+ t.getArea(bottom, height));
		System.out.println("임의로 변경한 값의 삼각형 넓이 : "+ t.getArea(5, 10));
	}

}
  1. ===========================================================
  • 천리길도 한 걸음부터라는 말이 있다.
    하나하나 차근차근 기능을 만들어주는 것이 중요하다.
    그리고 만들려는 것이 어떤 근본의 규칙을 가지고 있는지 파악하는 것이
    무엇보다 중요하다.
  • 구슬게임은 누군가 얻으면 누군가 잃으므로 상호작용할 수 있는 메소드를 만들어주고
    그 메소드를 불러서 값을 변하게 하는 원리이다.
class gusle 
{
	// 멤버변수 : 어린이가 보유한 구슬의 개수
	int bead;

	// 멤버 변수를 초기화 할 목적으로 정의한다.
	public gusle(int bead) // 생성자, 매개변수 1개 있는 생성자 ( 이름 같으면 )
	{
		// this는 멤버변수와 매개변수
		this.bead = bead; // 멤버변수 안에 매개변수를 넣는다
		/*
		 this의 활용법
		 1. 해당 클래스의 멤버를 가리킬때 사용한다
		 2. 오버로딩으로 정의된 또 다른 생성자를 호출할 때 사용한다
		 이 때는 this(인수1, 인수2)와 같이 기술한다
		 */
	}
	
	// 어린이가 보유한 구슬의 개수를 출력한다
	public void showProperty()
	{
		System.out.println("보유한 구슬의 개수 : " + bead);
	}

	/*
	구슬게임을 위한 멤버 메소드
	▶ 구슬의 총 개수는 한정적이므로 한 사람이 잃으면 한 사람은 얻게 되어 있다. 
	 */
	public void obtainBead(gusle child, int beadCount)
	{
		// this는 객체 자신이 되므로, 호출의 주체는 구슬이 증가한다.
		this.bead += beadCount; // 한 아이가 구슬을 얻으면 
		
		// 매개변수로 전달된 어린이의 구슬은 잃게 되므로 .(닷)으로 접근
		//하여 잃게 하면 된다
		child.bead -= beadCount; // 다른 아이는 구슬을 잃는다		
	}
	
}

public class ClassTwo
{

	public static void main(String[] args)
	{
//		2. 구슬치기 하는 아이들을 추상화하여 클래스로 정의해보자.
//		*어린아이가 보유하고 있는 구슬의 개수 정보를 담는다
//		*놀이를 통해 구슬을 획득 또는 상실하는 것을 표현한다.
//		*어린이의 현재 보유하고 있는 구슬의 개수를 표현한다.
//		초기화는 다음과 같이 진행한다.
//		◆어린이1의 보유갯수 : 구슬 20개
//		◆어린이2의 보유갯수 : 구슬 15개
//		게임은 다음과 같이 진행한다.
//		◆1차게임 : 어린이1은 어린이2의 구슬 5개를 획득한다.
//		◆2차게임 : 어린이2는 어린이1의 구슬 9개를 획득한다.
//		ㄴ어린이 객체를 생성시 구슬의 보유갯수는 생성자를 통해 초기화 되어야 한다.
		
		gusle child1 = new gusle(20); // 구슬 20개를 가진 어린이1 객체 생성
		gusle child2 = new gusle(15); // 구슬 15개를 가진 어린이2 객체 생성

		System.out.println("게임 전 구슬의 보유 개수");
		System.out.print("어린이1 : ");
		child1.showProperty(); //어린이1에 해당하는 호출하는 멤버 메소드를 부른다.
		System.out.print("어린이2 : ");
		child2.showProperty(); //어린이2에 해당하는 호출하는 멤버 메소드를 부른다.	
		
		/*1차게임 : 어린이1은 어린이2의 구슬 5개 획득*/
		child1.obtainBead(child2, 5); // 전달된 어린이1은 +5, 어린이2는 -5

		System.out.println("\n1차 게임 후 구슬의 보유 개수");
		System.out.print("어린이1 : ");
		child1.showProperty(); 
		System.out.print("어린이2 : ");
		child2.showProperty();
		
		/*2차게임 : 어린이2가 어린이1의 구슬 9개 획득*/
		child2.obtainBead(child1, 9); // 전달된 어린이2는 +9, 어린이1는 -9

		System.out.println("\n2차 게임 후 구슬의 보유 개수");
		System.out.print("어린이1 : ");
		child1.showProperty(); 
		System.out.print("어린이2 : ");
		child2.showProperty();
	}
}
  1. ================================================

먼저 데이터 보호를 위해 private으로 선언해준 이후
직접 접근이 안되므로 매개변수가 있는 생성자를 만들어준다.
생성자를 통해 자유롭게 간접적으로 접근이 가능해진다!

곧바로 단도직입적으로 계산하는 멤버메소드를 생성해준 후

메인 메소드에서 사용자로부터 입력값을 받고 차례대로 저장한 후
계산하는 멤버 메소드로 값을 보내어 반환을 받는 것이다.
그 값을 출력하는 간단한 프로그램이다.

import java.util.Scanner;

class ClassThree
{
	// 정보은닉화 private
	private int kor, eng, math;

	// 매개변수가 있는 생성자 : 
	// 직접 접근이 안되어서 간접적으로 불러오기 위해 
	public ClassThree(int kor, int eng, int math)
	{
		this.kor = kor;
		this.eng = eng;
		this.math = math;
	}
	
	// 계산하는 멤버 메소드
	public int avgr() 
	{
		return ( kor + eng + math ) / 3;
	}
	
	public static void main(String[] args)
	{
//		3. 성적 클래스를 작성해보자. 국어,영어, 수학 과목의 3개의 점수를 입력받아 
//		객체를 생성하고 성적 평균을 출력하는 프로그램을 만들어라.
		// 사용자로부터 입력값을 받고
		Scanner scan = new Scanner(System.in);
		
		// 각 변수에 저장한다
		System.out.println("국어 영어 수학 점수를 순서대로 입력하시오:");
		int kor = scan.nextInt();
		int eng = scan.nextInt();
		int math = scan.nextInt();
		
		// ClassThree 클래스의 avg 객체를 생성하고 3변수를 담는다.
		ClassThree avg = new ClassThree(kor,eng,math); 
		// avgr() 멤버메소드에 저장된 3변수를 담아서 출력한다. 
		System.out.println("당신의 평균 점수는 " + avg.avgr() + "점!");
	}
}
  • 이렇게 클래스의 기초를 다루어보았다.
    생각해보면 자바(Java)는 중요하지 않는 것이 없는게 사실이다.
    앞으로도 꿀 떨어지는 포스팅은 계속된다..
profile
[Java SQL HTML CSS JS Studying] 발전을 꿈꾸며 이상을 실현합니다
post-custom-banner

0개의 댓글