본문 바로가기

Programming Language/JAVA

[JAVA] 클래스,객체와 메소드 & 접근제한자

 

 

★★ 클래스와 메소드에 대해 소개하기 앞서서, 이 Part는 중요하다는 말씀을 꼭 드리고싶습니다.
저는 다시 자바공부를 하면서 느낀건 그냥 보여진 소스를 입력하고 출력하고 "아 이거구나"라고 끝내는게 아닌
정말 저 클래스가 무엇이고, 메소드는 무엇이고, 어떻게 동작되고 하는 전체적인 흐름을 파악하기위해
이 파트를 이해하려 많이 노력했었습니다. 자바는 객체지향언어이기에 기본이 탄탄한 개발자가 되고싶었습니다!
앞으로 공부를 하다보면 더 중요한것이 있을수도있겠지만,
이 파트를 이해하면서 느낀게 많았기에 중요하다는걸 말씀드리고 싶었습니다.
정말 초보자들이라면 많은 시간을 투자하시는걸 추천해드립니다!
( 제 블로그말고도 각종 책과 인강 그리고, 다른블로그들도 있으니 보시면서 공부하시면 좋을거같아요!! ) 
+ 어떤책을 살지 모르시는 분들을 위해 제가 따로공부했던 "이것이 자바다"라는 책 추천드립니다!

 

 

 

 

 

 

Class
현실에 있는 하나의 대상체에서 제작하고자 하는 프로그램에 필요한 속성과 동작만을 추려내어 설계하는 문법입니다.
  현질에 있는 대상을 프로그램으로 옮기기 위해 쓰는 설계도라고 할수있습니다. 클래스에는 객체를 생성하기 위한
  필드, 생성자, 메소드로 구성되어있습니다.

객체 (=인스턴스 instance)
설계하여 생성된 class를 바탕으로 만들어 낸 class변수를 의미합니다.
  메모리에 실제 형성되었으며 형성된 공간을 통해 접근하여 사용합니다.

★ 객체를 생성하는 순서  ( 쉽게 이해하기 )
자동차(객체)를 만들기 위해서 자동차개발자(프로그래머)들은 설계도(클래스)를 먼저 만듭니다.
설계도(클래스)를 바탕으로 자동차(객체)를 만들고, 설계도(클래스)하나만 있으면 자동차(객체)를 여러개를 만들수있습니다.

 


자동차만의 가지고있는 기능들이있습니다.
기아변속, 멈추기(브레이크), 전방센서, 네비게이션 등등 이런 기능들은 모두 설계도(클래스)를 작성할 당시
메소드를 통해 모두 만들어준다면 자동차(객체)를 생성할때마다 그 기능을 모두 가지고 만들어집니다.

또한, 자동차(객체)들을 색상별로 따로 만들수있습니다. 예를 들어 설계도(클래스)를 작성할 당시
생성자를 통해 색상을 입력해서 만들게 해준다면, 자동차(객체)를 만들때  빨간자동차를 원한다면 빨간색을 생성자를 통해 만들어주고, 초록자동차를 원한다면 초록색을 생성자를 통해 만들어줍니다. 

※ 클래스 구성 멤버
1. 필드 (Field) :
객체의 데이터가 저장되는 곳
2. 생성자 (Constructor) :
객체 생성시 초기화 역할 담당 , 객체생성시 사용
3. 메소드 (Method) :
객체의 동작에 해당하는 실행 블록


예 >
public class ClassName {
        //필드
        int fieldName;

        //생성자
        ClassName() {

         }

        //메소드
        void methodName() {

         }

 

 

 

 

 

package test;

class Car {
	String brand; //차브랜드
	String name; //차이름
	String year; //연식
	
	Car(String color){
		System.out.println(color+"자동차가 생성되었습니다.");
	}
	
	void brake() {
		System.out.println("차가 멈추는 기능입니다.");
	}
	
	void navigation() {
		System.out.println("네비게이션기능 입니다.");
	}
	
}

public class Me {

	public static void main(String[] args) {
		Car car1 = new Car("빨간색"); 
		Car car2 = new Car("초록색");
                car1.brake();
                car2.brake();
	}

}

* 위 객체를 생성하는 순서 설명에 맞는 코드를 짜보았습니다.
우선, 클래스(설계도)를 2개로 나누었습니다. 첫번째 클래스는 car에 대한 설계도인 클래스이고, 두번째는 Main메소드를 가지고있는 클래스입니다. ( 무조건 Main메소드가 먼저 실행됩니다.) 
클래스 구성멤버에 처음에 있는 
brand, name, year 변수는 필드라고도 불리고, 클래스에서 사용할 필드입니다.
하지만, 위 코드에서는 사용하지않았습니다. 클래스에 이렇게 구성된다는걸 보여주기위해 선언했습니다.
두번쨰로 void가 없는 그냥 Car(String color){} 이부분은 생성자로써, 메소드와 헷갈릴수있습니다.
간단하게 void 또는 리턴타입이 없는 클래스명와 같은 이름이면 생성자입니다. 이 생성자는 맨아래 Me라는 클래스에
Main메소드안에 보시면 빨간색과 초록색을 만들기위해 괄호안에 넣어주었습니다. 저 괄호안에 들어가는것이 파라미터값이고,
color가 괄호안에있는데 이건 매개변수라고합니다. 즉, 빨간색을 보내면 빨간색을 만들고, 초록색을 보내면 초록색을 받아 만들어줍니다. 그렇기 때문에 컴파일해서 출력하면 위처럼 콘솔창에 뜨게됩니다.
그리고 마지막으로 메소드입니다.
메소드는 간단하게 브레이크와 네비게이션으로 구성했습니다. 이밖에도 자동차 기능은 무수히 많겠지만, 저는 이것만했습니다. 
Me클래스를 통해서 new연산자를 사용하면 클래스를 불르고 객체명을 개발자가 변수처럼 입력해주면 하나씩 생성됩니다.
생성된 객체는 Car객체안에있는 메소드들을 모두 사용할수있습니다.
예를 들면 car1.brake();라고 Main메소드에 적으면 "차가 멈추는 기능입니다."라는 문구가 출력됩니다.

 

 

 


 

 

 

 접근제한자
☞ Private : 클래스 내부에서만 접근가능
☞ Protected : 일반적인 경우에는 Private와 동일하게 클래스 내부에서만 접근이 가능하지만, 상속시에만 
                       자식클래스에서도 접근이 가능
☞ Public : 클래스 내부,외부 모두 접근이 가능
☞ default : Public, Private의 값이 없다면 동일한 패키지 안에서 접근 허용

 

 

import java.util.Scanner;

class Test{
	public int age;
	public String name;
	public String addr;
}

public class Test02 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Test t = new Test();
		System.out.print("나이 입력: ");	t.age=sc.nextInt();
		System.out.print("이름 입력: ");	t.name=sc.next();
		System.out.print("주소 입력: ");	t.addr=sc.next();
		
		System.out.println("이름 : "+t.name);
		System.out.println("이름 : "+t.age);
		System.out.println("이름 : "+t.addr);
	}
}

Test클래스와 Test02클래스를 만들어주고 Test02클래스에서 Main메소드를 실행합니다.
Test클래스에는 필드만 public 접근제한자로 선언해줍니다.
그리고 Main메소드가 있는 Test02클래스에서는 Scanner클래스타입으로 new연산자로 객체를 생성해주고,
Test클래스도 객체를 t로 생성해줍니다. 나이를 sc객체인 Scanner클래스의 메소드 기능을 사용해서 
사용자로부터 입력받고 t객체에있는 age변수(필드)에 저장해줍니다. name과 addr도 똑같이 저장해줍니다.
현재 t객체인 age,name,addr 변수를 각각 메시지 출력해줍니다.

 

 

 

 

import java.util.Scanner;

class Test{
	private int age;
	private String name;
	private String addr;
}

public class Test02 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Test t = new Test();
		System.out.print("나이 입력: ");	t.age=sc.nextInt();
		System.out.print("이름 입력: ");	t.name=sc.next();
		System.out.print("주소 입력: ");	t.addr=sc.next();
		
		System.out.println("이름 : "+t.name);
		System.out.println("이름 : "+t.age);
		System.out.println("이름 : "+t.addr);
	}
}

이번에는 private 접근제한자로 필드를 선언해줍니다.
콘솔창을 실행보면 에러가 뜨는데 이유는 Test클래스에서만 접근이 가능하고, Test02클래스에서는
접근이 불가능하기때문에 에러가 뜹니다.

 

 

 

 

 

 

class MethodTest{
	public void test() {
		System.out.println("MethodTest.test()입니다.");
	}
}



public class Test05 {

	public static void main(String[] args) {
		MethodTest mt = new MethodTest();
		mt.test();
	}

}

* 메소드 설명

 

MethodTest클래스에서 test메소드를 선언해주었습니다.
메소드(기능) 안에는 "MethodTest.test()입니다." 메시지를 출력해주도록 만듭니다.
Main메소드가 있는 Test05 클래스에 방금 만든 MethodTest클래스의 객체를 생성해줍니다.
mt객체를 통해 방금만든 test메소드를 호출해주면 "MethodTest.test()입니다." 메시지를 출력해줍니다.

 

 

 

 

 

import java.util.Scanner;

class MethodTest_02{
	public void sumFunc() {
		Scanner sc = new Scanner(System.in);
		int num, su;
		System.out.print("수 입력 : ");
		num = sc.nextInt();
		System.out.print("수 입력 : ");
		su = sc.nextInt();
		System.out.println("두 수의합 : "+(num+su));
	}
}


public class Test {
	public static void main(String[] args) {
		MethodTest_02 mt = new MethodTest_02();
		mt.sumFunc();
		System.out.println("다음문장실행!!");
	}

}

이번에는 MethodTest_02클래스와 Test클래스를 만들어줍니다.
MethodTest_02클래스에는 sumFunc()메소드를 만들어줍니다. Scanner객체를 생성해주고, 
메소드안에 두개의 수 입력을 해서 합산한 결과를 메시지를 출력해서 돌려주게 만듭니다.
이번에는 Main메소드가 있는 Test클래스에서 MethodTest_02클래스 객체를 생성해주고,
mt객체를 통해 sumFunc()메소드를 호출하면 위에서 메소드안에 만들어준 내용이 콘솔에 출력이되고 합산
결과가 출력된다음 다음 문장인 "다음문장실행!!"이 출력되면서 종료됩니다.

 

 

 

 

 

 

import java.util.Scanner;

class MethodTest_03{
	int sum=0;
	
	public void sumFunc(int num1, int su1) {
		sum=num1+su1;
		System.out.print("두 수의 합 : "+(sum));
	}
}

public class Test {
	public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	MethodTest_03 mt = new MethodTest_03();
	int num,su;
	System.out.print("수 입력 : ");
	num=sc.nextInt();
	System.out.print("수 입력 : ");
	su = sc.nextInt();
	mt.sumFunc(num, su);
	}

}

MethodTest_03클래스와 Test클래스를 만들어줍니다.

 

MethodTest_03클래스에서 필드를 sum변수를 선언해주고, sumFunc메소드를 선언하되, 매개변수로 num1변수와
su1변수를 콤마를 통해 두개 받습니다. 받은 이 두개의 변수는 sumFunc메소드안에서만 사용이되며, 
sum = num1+ su1; 연산식을 거치게됩니다. sum은 필드에서 선언했기에 사용이 가능하고, num1과 su1는
숫자가 들어가있는 상태로 덧셈이 됩니다. 더한값을 메시지로 sum이 출력됩니다.
이렇게 만든 메소드를 사용하기위해서 Test클래스에서 Main메소드에 MethodTest_03클래스로 객체생성해주고,
수입력을 num과 su에 각각 입력된값을 저장한뒤, mt객체안에있는 sumFunc메소드를 호출합니다.
이때, 괄호안에 사용자가 입력한 num과su값을 매개변수로 넣어줍니다. 그러면 이값이
위에서 메소드 선언시 괄호안에 받아주는 num1과su1가 그값을 그대로 받아서 메소드안에서 사용됩니다.

 

 

 

import java.util.Scanner;

class MethodTest_04{
	public int sumFunc(int num, int su) {
		int sum =0;
		sum = num+su;
		return sum;
	}
}

public class Test {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		MethodTest_04 mt = new MethodTest_04();
		int num, su;
		System.out.print("수 입력 : ");
		num=sc.nextInt();
		System.out.print("수 입력 : ");
		su=sc.nextInt();
		int sum=mt.sumFunc(num, su);
		System.out.println(num +"+"+su+"="+sum+"입니다.");
	}

}

MethodTest_04 클래스와 Test클래스를 만들어줍니다.
MethodTest_04 클래스안에 sumFunc메소드를 선언해주고, 매개변수도 괄호에 넣어줍니다.
자세히보시면 public뒤에 int가 적혀있습니다. 이 메소드안에 모든 실행을 다한뒤, 마지막 return으로 sum을
넘겨주는데 즉, Main메소드에서 sumFunc메소드 호출시, 모든 중괄호 안에 실행한뒤 return으로 int형 타입인
sum을 넘겨주는것입니다. 이전에는 void로 리턴했는데 void는 리턴해줄 데이터타입이 없을경우, 메시지출력으로
리턴해줄경우 사용하게됩니다. 
Test클래스에서 MethodTest_04클래스 객체생성하고 두개의 수입력을한뒤, 매개변수로 입력된 값을 그대로
넘겨주고, 왼쪽에 int sum = <-으로 받아주는이유는 메소드를 호출할때 리턴으로 int형이 넘어오기에
받아줘야하므로 sum으로 받아줍니다. 그값을 그대로 메시지출력해줍니다.

 

 

 

 

 

 

class MethodTest_05{
	 String big(int x, int y) {
		if(x>y) {
			return x+"이"+y+"보다 크다";
		}else if(y>x){
			return y+"이"+x+"보다 크다";
		}else {
			return x+"과"+y+"는 같다";
		}
	 }


public class Test {

	public static void main(String[] args) {
		MethodTest_06 mt = new MethodTest_06();
		String str =null;
		str = mt.big(100, 200);
		System.out.println("결과 값 : "+str);
	}

}

MethodTest_05 클래스와 Test클래스를 만들어줍니다.
MethodTest_05클래스에 big메소드를 선언해주고, 매개변수로 x와y를 만들어줍니다.
중괄호안에 실행문으로 if-else문으로 만들어줬고, 넘어온 값 x가 넘어온y의 값보다 클경우,
x+"이"+y+"보다 크다"를 리턴해줍니다. 리턴값으로 String을 했기에 위처럼 넘겨줬습니다.
y가 클경우에는 y+"이"+x+"보다 크다"가 리턴됩니다. 
그렇지 않을경우는 같기때문에 x+"과"+y+"는 같다" 가 리턴되게 만들었습니다.
Test클래스에서 Main메소드에 MethodTest_05클래스 객체를 생성해주고, 받아줄 str변수를 선언해줍니다.
mt객체를 통해 big메소드를 호출할때 100과200을 넘겨줍니다. 즉, big메소드에서 받을때는 x=100 / y=200가
됩니다. y가 더크기에 big메소드에서는 y+"이"+x+"보다 크다"가 리턴되고 그값을 그대로 Main메소드인
str변수에 저장됩니다. 그값을 메시지로 출력해줍니다.