클래스와 객체

zee-chive·2024년 7월 17일

Java

목록 보기
3/12

객체지향 프로그래밍 (Object Oriented Programming)

  • 객체 : 데이터와 관련된 알고리즘(메서드)를 하나의 단위로 묶어 놓은 것
    • 알고리즘 : 어떤 데이터를 사용하기 위해 짜놓은 로직, 동작과 행위를 뜻함
    • 데이터 : 속성, 상태
  • 객체지향 프로그래밍 : 객체 단위로 코드를 작성하여, 객체 간의 상호작용으로 프로그램 설계
  • 객체 모델링 : 현실 세계 객체를 SW로 설계하는 것 (ex : 학사관리 시스템 )

  • 객체지향 프로그래밍 특징
    - 추상화 : 객체의 불필요한 세부사항을 숨기고, 필요한 인터페이스만을 제공
    - 다형성 : 상속 또는 구현 관계에 있을 때, 객체들이 서로 다른 방식으로 동작
    - 상속 : 기존의 설계도를 재사용, 하나의 클래스가 다른 클래스의 속성과 메소드를 물려 받음
    - 캡슐화 : 객체의 데이터와 메서드를 하나로 묶고, 외부로부터 세부사항 숨기는 것

  • 객체지향 프로그래밍 장점 : 코드의 재사용성, 유지보수성, 유연성과 확장성






함수

  • 관련된 특정 작업을 수행하는 문장들을 하나로 묶은 모임
  • 함수의 구성 요소 : 반환타입 함수 이름 매개 변수 함수 몸체
  • 자바에서는 함수가 클래스의 일부분으로서 존재(메서드 : 객체의 멤버 함수)
  • 중복을 줄이는데 의의가 있다.

public class FunctionTest {
	public static void main(String[] args) {
		System.out.println("아침에 일어난다.");
		교육();
		System.out.println("집으로 돌아간다.");
	}

	public static void 교육() {
		System.out.println("오전 수업을 듣는다.");
		System.out.println("점심을 먹는다.");
		System.out.println("오후 수업을 듣는다.");
	}
}

  • 함수의 매개변수 : 호출 시 값을 넣어서 실행이 가능한 것
	public static void main(String[] args) {
		System.out.println("아침에 일어난다.");
		이동("교육장", "지하철");
		교육();
		이동("집", "버스");
		System.out.println("집으로 돌아간다.");
	}
	// 파라미터로 관리 
	public static void 이동(String where, String how) {
		System.out.println(where + "으로 " + how + "를 타고 이동한다.");
	} 

  • 함수의 반환값
    • void 를 작성하게 되는 경우, 함수에 반환 값이 없다는 것이다.
    • 반환이 있는 경우, 반환형 함수이름() { ... return '반환값'}
	public static void main(String[] args) {
		System.out.println("아침에 일어난다.");
		이동("교육장", "지하철");
		boolean 과제 = 교육();
		이동("집", "버스");
		
		if(과제) System.out.println("과제를 해결한다.");
	}

	public static boolean 교육() {
		System.out.println("오전 수업을 듣는다.");
		System.out.println("점심을 먹는다.");
		System.out.println("오후 수업을 듣는다.");
		
		Random random = new Random();
		
		return random.nextBoolean();
	}




클래스 (Class) - 객체를 만들기 위한 틀

  • 관련 있는 변수와 함수를 묶어서 만든 사용자 정의의 데이터 타입이다.
  • 프로그래밍의 목적을 고려하여 클래스를 설계하고 객체를 생성
  • 각 객체들이 어떤 특징(속성과 동작)을 가지고 있을 지 결정.
	String yang_name = "Yang";
	int yang_age = 45;
	String yang_hobby = "Youtube";
		
	String hong_name = "Hong";
	int hing_age = 25;
	String hong_hobby = "Golf";
		
	int size = 2;
	String[] names = new String[size];
	int[] age = new int[size];
	String[] hobby = new String[size];
		
	names[0] = "Yang";
	names[1] = "Hong";
	age[0] = 45;
	age[1] = 25;
	hobby[0] ="Youtube";
	hobby[0] ="Golf";
	// 각 배열의 연관성을 정할 수 없으므로 실패한다. 

이렇게 작성하면 변수가 너무 많고, 배열로 지정하게 되는 경우 연관성이 없어 실패한다.


public class Person {
	//class => 변수를 묶어 놓는 것. 
	String name;
	int age;
	String hobby; 
}

public class PersonTest {
	public static void main(String[] args) {
		
		// yang 이라는 변수의 메모리를 갖게 된다. 
		Person yang = new Person();
		yang.name = "Yang";
		yang.age = 45;
		yang.hobby = "Youtube";
		
		Person hong = new Person();
		hong.name = "Hong";
		hong.age = 25;
		hong.hobby = "Golf";
	}
}

class를 통해 객체 생성하여 값을 변경하게 되면, 관리가 쉬워진다.

클래스의 구성 요소

  • 멤버 변수 : 속성
  • 멤버 메서드 : 동작
  • 생성자
  • 중첩 클래스

class 선언 문법






인스턴스 (Instance)

  • 클래스를 통해 생성된 객체 (실제로 메모리 내부에 생성이 된 것)

메소드(Method)

  • 객체가 할 수 있는 행동을 정의

  • 어떤 작업을 수행하는 명령문의 집합에 이름을 붙여 놓는 것

  • 메서드 선언 : {}

  • 메서드 호출 : Person p = new Person(); 사용하는 경우 p.info()



매개변수(Parameter)

  • 메서드에서 사용하는 것
  • 인자 : 호출하는 쪽에서 전달하는 것으로 호출하는 메서드 입장에서 보는 것이다.
  • 매개변수는 생략이 가능하고, 파라미터 전달 시 묵시적 형변환이 된다.


public class Person {
	void study(int time) {
		// 호출 시 넘겨준 값이 초기화가 된다. 
		System.out.println(time + " 시간 동안 공부합니다.");
	}
}

public class PersonTest {
	public static void main(String[] args) {
		Person p = new Person();
		
		p.study(10);
		// 묵시적 형변환 
		p.study((short)10);
		p.study((byte)2) ;
		p.study('a');
	}
}

명시적 형변환이 필요한, 매개변수보다 큰 값이 들어가는 경우는 사용할 수 없다.



메서드 오버로딩 (Overloading)

  • 이름이 같고 매개변수가 다른 메서드를 여러 개 정의하는 것
  • 파라미터의 갯수 또는 순서, 타입이 달라야 한다.
  • 변수의 이름만 다르거나 리턴 타입이 다른 것은 의미가 없다.

public class Person {
	void study(int time) {
		System.out.println(time + " 시간 동안 공부합니다.");
	}
	void study(long time) {
		System.out.println(" 긴" + time + " 시간 동안 공부합니다.");
	}
}




매개변수의 값과 종류가 다르면 그에 맞게 사용이 가능하다.






생성자

  • new 키워드와 함께 호출하여 객체 생성 : 객체를 생성할 때 사용
  • 클래스 명과 생성자는 동일한 이름을 갖는다.
  • 반환 타입 없음
  • 필드를 초기화 할 때 주로 사용 된다.
    -기본 생성자의 자동 제공 : 클래스에 생성자가 하나도 정의되지 않으면, 컴파일러가 자동으로 매개변수 없는 기본 생성자 추가

-this() 를 사용하여 같은 클래스의 다른 생성자를 호출할 수 있다.

Dog(String name, int age){
	this.name = name;
	this.age = age;
}

this 의 경우 현재 메소드에서 갖고 있는 값을 갖고 온다는 것이다.
변수에 이름의 의미가 있는 경우, 매개변수와 필드의 이름을 동일하게 사용하기 위해서.

Dog(String name){
	// .이 없이 괄호가 된다면, 갖고 있는 생성자를 호출한다는 것이다
	// 제약사항 : 반드시 생성자 본문 첫번째 줄에 있어야 한다. 
	this(name,5); 
}
  • 인스턴스에 대한 참조이므로 static 메서드 또는 static 블록에서 this 사용 불가.
  • 메서드 체이닝 (Method Chaining) : 메서드에서 this를 반환하여 호출을 연쇄적으로 이어감.
	Dog eat() {
		System.out.println("사료를 먹고 ... ");
		return this;
	}
	void drink() {
		System.out.println("음료를 마신다.");
	}

d.eat().drink() 를 하게되는 경우, eat의 print를 실행하고
this를 다시 return 하여서 drink도 실행 가능하게 된다.

profile
누가 봐도 읽기 쉬운 글이 최고의 글이다.

0개의 댓글