클래스(Class)

  • "변수, 메소드 묶을 수 없을까?" 이런 생각에서 시작한 것이 클래스
  • 변수와 함수를 사용하기 편리하게 재사용이 가능하도록 모아 놓은 것
  • 객체를 정의해 놓은 것으로 객체를 생성하는 데 사용한다.
  • 클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(Method)로 구성됩니다. 즉, 필드란 클래스에 포함된 변수를 의미합니다. 또한, 메소드란 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라고 할 수 있습니다.
  • 클래스란 객체 지향 프로그래밍의 추상화라는 개념을 직접 구현한 것이라 할 수 있습니다.
  1. 주어이다.
    모든 문장 맨 앞에 클래스가 나오고 영어는 맨 앞을 항상 대문자로 적는다.따라서 클래스는 주어이고, 대문자로 시작한다.
  2. 타입이다.
  • 클래스는 추상적인 개념이고 이 클래스 안에는 필드가 존재한다.
  • 추상적인 것을 바로 사용할 수 없기 때문에 그 필드들을 구체화시킨 대상이 필요하다. 이러한 것들을 객체라고 부르고 영어로는 instance variable이라고 부른다. (붕어빵)

객체 / 인스턴스

  • 객체(Object)
    실제로 존재하는 사물 또는 개념을 구체화한 물체
  • 인스턴스(Instance)
    클래스로부터 객체를 생성(인스턴스화)한다. 메모리에 할당된 객체
  • 인스턴스화(Instantiate)
    클래스로부터 객체를 만드는 과정을 클래스의 객체화 또는 인스턴화한다고 표현한다.

객체의 설명
1. Tv t;
Tv클래스 타입의 참조변수 t를 선언한다. 메모리에 참조변수 t를 위한 공간이 마련된다.
2. t = new Tv();
연산자 new에 의해 Tv 클래스의 인스턴스가 메모리의 빈 공간에 생성된다.
3. t.channel = 7;
참조변수 t에 저장된 주소에 있는 인스턴스의 멤버변수 channel에 7을 저장한다.
4. t.channelDown();
참조변수 t가 참조하고 있는 Tv인스턴스의 channelDown메서드를 호출한다.

필드

  • 객체의 데이터가 저장되는 곳
    int fieldName;
  • instance 예, 예시라는 뜻이고 추상적인 개념의 한 예시로서 객체가 나오기 때문에 istance variable이라 부른다.
  • 추상적인 개념인 클래스를 객체로 구체화해서 만드는 작업을 객체화라고 하여 instance화 라고 한다.

클래스 정의

	class 클래스명 {
      // 멤버변수 정의
      변수타입 변수명;
      …

      // 멤버함수(메소드) 정의
      public 리턴타입 함수명() {
         실행 명령어;
      }
}
  • 지역 변수 : 메소드 내부에 선언된 변수
  • 전역 변수 : 메소드 외부, 클래스 내부에 선언된 변수
  • 정적 변수 : static이 붙은 변수

클래스 사용

클래스는 추상적인 틀이기 때문에 먼저 객체화를 진행한다.

	클래스명 객체명 = new 클래스명();
	객체.변수
	객체.메소드()
  • 하나의 저장공간에는 단 한개의 값만 담을 수 있다.
  • 필드에는 여러개의 값이 존재하기 때문에 필드는 다른곳(Heap)에 할당되고 할당된 필드의 주소값을 기억하는 것이 객체이다.
	class Animal {
	String name;
	
	// setter 메소드 아님
	public void setName(String name) {
		this.name = name;
	}
}
public class Class {

	public static void main(String[] args) {
		Animal cat = new Animal();
		cat.setName("boby");
		
		Animal dog = new Animal();
		dog.setName("happy");
		System.out.println(cat.name);
		System.out.println(dog.name);
	}

}
	class Student1 {
	String name;
	int eng;
	int kor;
	
	Student1() {
		name = " ";
		eng = 0;
		kor = 0;
	}
	

	// this는 내 자신을 가르킨다.
	Student1(String name, int eng, int kor) {
		this.name = name;
		this.eng = eng;
		this.kor = kor;
	}
	
	// 이름을 출력하는 메소드
	public void printName() {
		System.out.println("학생의 이름은 " + name + "입니다.");
	}
	
	// 성적을 출력하는 메소드
	public void printScore() {
		System.out.println("영어 점수는 " + eng + "입니다.");
		System.out.println("국어 점수는 " + kor + "입니다.");
	}
	
	
	// 이름과 총점을 출력하는 메소드
	public void printInfo() {
		System.out.println("제 이름은 " +name+ "이고, 점수는 " + (eng + kor) + "입니다.");
	}
}

public class ClassConst {

	public static void main(String[] args) {
		Student1 st = new Student1();
		
		// 멤버 변수 값 저장(사용)
		st.name = "홍길동";
		st.eng = 90;
		st.kor = 100;
		
		Student1 st3 = new Student1("홍길동", 90, 100);
		
		// 멤버 함수 사용
		st.printName();			// 이름출력
		st.printScore();		// 점수출력
		st.printInfo();			// 정보출력
	
		Student1 st1 = new Student1("김유신", 90, 100);
		st1.printInfo();
		Student1 st2 = new Student1("이순신", 90, 100);
		st2.printInfo();
		
		// 생성과 초기화를 동시에
//		int a;					// 선언
//		a = 10;					// 초기화
//		int a = 10;

		
	}

}

클래스 배열

  • 객체를 여러개 선언해야 하는 경우 배열 타입으로 한번에 선언 후 사용
  • 각 객체는 규칙성이 없기 때문에 규칙성을 부여하기 위해 사용한다.

클래스 배열 선언

	클래스 배열 선언
	클래스명[] 배열명 = {
		new 생성자(),
		new 생성자(),
		...
	};
	→ 배열명은 주소값을 가지고 있다.

	String[] arr = new String[3];
					→ 3개의 주소값을 만드는데, 거기에는 null이 담긴다.
					그래서 그냥 부르면 'nullException'이라는 오류가 발생한다.
					값을 넣어서 출력하면 arr에 주소값에 있던 값들이 출력이 된다.

클래스 배열 사용

	배열명[idx] 방이 객체를 의미하게 된다.

	배열명[idx].변수
	배열명[idx].메소드()

생성자

  • 클래스 이름 뒤에 소괄호, 객체 생성시 초기화 역할 담당
  • 생성자는 메소드와 똑같은 기능을 가지고 있다.
  • 리턴을 할 수 없기 때문에 메소드라고 부르지 않는다.
  • 클래스 선언 시 자동으로 생성자가 하나 만들어지고 코드상에는 나타나지 않는다. 이런 생성자를 기본 생성자라고 하며, 만약 직접 생성자를 선언하게 되면 기존에 있던 기본 생성자는 사라지게 된다.
  • 자식 클래스를 만들고 생성자를 만들어 주지 않으면 자동으로 기본 생성자가 형성이 되고 자식 클래스의 생성자는 'super()'이다.
 	Student1() {
		name = " ";
		eng = 0;
		kor = 0;
	}
	

	// this는 내 자신을 가르킨다.
	Student1(String name, int eng, int kor) {
		this.name = name;
		this.eng = eng;
		this.kor = kor;
	}

생성자의 목적

  1. 클래스의 필드를 똑같이 복사해서 메모리에 할당해주고 할당된 필드의 주소값을 가지고 온다. 이 주소값을 객체에 넣어놓고 사용한다. (객체화의 목적)

  2. 생성자는 호출 시 내부의 내용을 모두 수행한다. (초기화의 목적)

    생성자 단축키 : Alt + Shift + s → o


Getter와 Setter 메소드

객체지향 프로그래밍에서 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다. 객체 데이터를 외부에서 읽고 변경시 객체의 무결성이 깨질 수 있기 때문이다. 따라서, 객체지향 프로그래밍에서는 메소드를 통해 데이터를 변경하는 방법을 선호한다. 데이터는 외부에서 접근하지 않도록 막고, 메소드는 공개해서 외부에서 메소드를 통해 데이터에 접근하도록 유도한다. (메소드는 매개값을 검증해서 유효한 값만 데이터로 저장할 수 있기 때문이다.)

▶ 이런 역할을 하는 메소드 : Setter

외부에서 객체의 데이터를 읽을 때도 메소드를 사용하는 것이 좋다. 객체 외부에서 객체 필드값을 사용하기 부적절한 경우가 있다. 이런 경우 메소드를 필드값을 가공 후, 외부로 전달한다.

▶ 이런 역할을 하는 메소드 : Getter

→ 요약 : 피드값에 부적절한 값이 대입되는 것을 막기 위해서 사용한다.

	class stat {
	private int power;
	private int dex;
	private int intel;
	
	public int getPower() {
		return power;
	}
	public void setPower(int power) {
    	// 음수면
		if(power < 0) {
        	// 0으로 맞춰준다.
			this.power = 0;
            // 0 위에면 this.power = power 실행
            // 매개변수에 온 power값을 전역변수에 넣어준다.
		} else {
			this.power = power;
		}
	}
	public int getDex() {
		return dex;
	}
	public void setDex(int dex) {
		if(dex < 0) {
			this.dex =0;
		} else {
			this.dex = dex;
		}
	}
	public int getIntel() {
		return intel;
	}
	public void setIntel(int intel) {
		if(intel < 0) {
			this.intel = 0;
		} else {
			this.intel = intel;
		}
	}
}

public class GetterSetter {
	
	public static void main(String[] args) {
		stat character = new stat();
		
		character.setPower(999);
		character.setDex(999);
		character.setIntel(999);
		
		System.out.println("나의 힘능력치는 : " + character.getPower());
		System.out.println("나의 민첩능력치는 : " + character.getDex());
		System.out.println("나의 지능능력치는 : " + character.getIntel());
	}

}

메소드

  • 어떤 기능을 하는 코드들을 재사용하기 위해 한 곳에 모아 처리하는 것
  • 매개변수라는 입력 값을 받아 무언가 처리하고 출력 값을 리턴한다.
  • 출력 기능을 하는 메소드로 print(), println() 등
  • 입력 기능을 하는 메소드로 next(), nextInt() 등

메소드 선언

클래스 안에서 선언하여 사용한다.

	public static 리턴타입 메소드명(매개변수) {
		실행할 코드;

		// 리턴이 있을 경우
		return 값(변수);
	}

	public static void myprint() {
		System.out.print("홍길동");
		System.out.println();
	}

메소드 사용

	메소드명()
	myprint();

Main()
메인 메소드도 메소드이다.
단, 자바에서는 프로그램 실행의 시작점이므로
꼭 있어야 하는 함수이며, 다른 이름으로 사용할 수 없다.

매개변수(Parameter)
메소드에 입력으로 값을 전달하기 위한 변수
여러개의 변수를 입력으로 줄 수 있으며 ','로 구분한다.

반환타입/반환값(Ruturn Type/Return Value)
메소드 처리가 완료된 후 어떤 값을 반환할 경우 사용한다.
→ return total;
→ return score;
단, 메소드 정의시 반환타입과 반환값의 타입이 일치해야 한다. 메소드 정의시 'void(공허한)'로 정의하면 반환값이 없다는 것이다.

	 * 두수를 입력받아 사칙연산(+-/*)를 하는 메소드를 만드세요.
		 * 
		 * 
		      사용예 calc(6, 3) 메소드를 호출하면 아래와 같이 출력
		     
		    더하기       9   
		    빼기        3   
		    곱하기      18
		    나누기       2
		 */
		 	
		 	calc(6, 3);
        
}
public static void calc(int a, int b)	{
			 System.out.println("더하기\t" +(a+b));
			 System.out.println("빼기\t" + (a-b));
			 System.out.println("곱하기\t" + (a*b));
			 System.out.println("나누기\t" + (a/b));
		 }
	/*    
          *메뉴를 표시하는 기능을 함수로 만들어 재사용하여 아래처럼 출력하세요.
		 * 
		 * hint)
		 * 메소드의 입력파라메터로 메뉴명과 가격을 입력받는다(String name, int price)
		 * 리턴 값으로는 price를 다시 리턴받는다.
		 * 이 리턴값을 총액 계산시 사용한다.
		 * 
		      결과

		     자장면      5000원   
		    짬뽕      6000원   
		    탕수육      10000원
		    ====================
		    총액      21000원
		 */
		 	int total = printMenu("자장면", 5000);
			total += printMenu("짬뽕", 6000);
			total += printMenu("탕수육", 10000);
			System.out.println("==================");
			System.out.println("총액\t" + total + "원");
		}
        public static int printMenu(String name, int price) {
				System.out.printf("%s\t%d원", name, price);
				System.out.println();
				return price;
        }

메소드 사용하는 가장 큰 이유

● 반복적으로 사용하는 코드들을 한 곳에 모아 코드를 재사용하기 위해
● 불필요한 중복 코드를 메소드로 정의하여 코드의 가독성을 높여주기 위해
● 현업에서는 남이 이미 정의해 놓은 함수를 재사용하는 일이 대부분이다.
profile
최선을 다하자!!

0개의 댓글

Powered by GraphCDN, the GraphQL CDN