자바 프로그래밍 (객체)

최주영·2023년 3월 14일
0

자바

목록 보기
6/30

✅ 자바에서의 객체란?

  • 클래스에 정의된 내용대로 new 연산자를 통해 메모리 영역에 생성된 것

✅ 클래스의 등장 배경

변수 (1개의 자료형 + 1개의 데이터) -> 배열 (1개의 자료형 + 여러개의 데이터)
-> 구조체(여러 개의 자료형 + 여러 개의 데이터) -> 클래스 등장

💡 구조체는 접근되고 싶지 않는 부분에도 모두 접근이 되기 때문에 단점이 있어서 클래스가 등장함!
클래스는 관례상 대문자로 시작하고 낙타 표기법을 사용한다

✅ 추상화

추상화란? : 유연성을 확보하기 위해 구체적인 것은 제거한다는 의미
추상화를 거쳐서 클래스를 만듬 -> 클래스를 활용하여 객체 생성
ex) 📌 추상화 예시 : 국민 한사람의 정보를 추상화 해보자! (클래스 다이어그램)



객체

현실에 존재하는 독립적이면서 하나로 취급되는 사물이나 개념으로 클래스에 정의된 내용대로 메모리에 할당된 결과물

💡 객체와 인스턴스의 차이점
-> 둘 다 의미는 비슷하지만 용어상 인스턴스는 객체보다 더 관계 에 초점을 맞춘 것
ex) student1은 Student 클래스의 인스턴스 이다

✅ 객체의 할당

new 연산자와 생성자를 이용하여 객체 생성 시 힙 메모리 공간에 할당된 객체 공간

  • ex) Student s = new Student(); -> 객체이름 s를 변수로 사용 = 참조형 자료형


Data dataA = new Data();
dataA.value = 10;
위 코드를 그림으로 나타나면

✅ 캡슐화 원칙

  • 클래스의 멤버 변수에 대한 접근 권한은 private을 원칙으로 한다.
  • 클래스의 멤버 변수에 대한 연산처리를 목적으로 하는 함수들을 클래스 내부에 작성한다.
  • 멤버 함수는 클래스 밖에서 접근할 수 있도록 public으로 설정한다.
  • 객체의 데이터는 객체가 제공하는 기능인 메서드를 통해서만 접근해야한다.
  • 정리하면 데이터는 모두 숨기고, 기능은 꼭 필요한 기능만 노출하는 것이 캡슐화 이다.

클래스(Class)
밑에 문법 예시

  • 클래스 안에는 (1).멤버변수(필드)    (2)초기화 블록    (3)생성자    (4)멤버함수(메소드) 으로 나뉜다.


✅ 필드 = 멤버변수

  • 필드 표현식
[접근제한자] [예약어] 자료형 변수명 [= 초기값];
//
ex)
public class Academy {
	public int temp1;
	protected int temp2;
	int temp3; // 접근제한자 생략 시 default
	private int temp4; // 캡슐화 원칙으로 private 사용
}
  • 필드 접근 제한자
구분해당 클래스 내부같은 패키지 내후손 클래스 내전체
publicOOOO
protectedOOOO
(default)OO
privateO
public > protected > default > private 순으로 범위가 작아짐!

✅ 초기화 블록

(1) 인스턴스 블럭 ({})

-> 인스턴스 변수를 초기화 시키는 블럭으로 객체 생성시 마다 초기화
-> 초기화 블록은 조건문이나 반복문을 사용할 때 사용
💡💡 초기화블록은 어떤 생성자를 실행하든 다 실행됨 (기본생성자 or 매개변수가 있는 생성자)

생성자

  • 객체가 new연산자를 통해 Heap메모리 영역에 할당될 때 객체 안에서 만들어지는 필드 초기화
  • 일종이 메소드로, 전달된 초기값을 받아서 객체의 필드에 기록하는 메소드
  • 생성자는 반환형이 없음 -> [접근제한자] 클래스명(){}
    📌 규칙! : 반환값이 없으며, 생성자이름을 클래스이름과 동일하게 해야함!
    //ex
    public class Person {
    	public String name;
    	public int age;
    	public char gender;
    	public double height;
    		
    	public Person() {   // 생성자는 클래스와 이름이 동일함!
    		System.out.println("Person 기본 생성자 실행!");
    		name = "유병승";
    		age = 19;
    		height = 180.5;
    		gender = '남';
    	}

생성자 표현식 2가지

  • (1) : [접근제한자] 클래스명() { }    -> 기본생성자
  • (2) : [접근제한자] 클래스명(매개변수) { (this.)필드명 = 매개변수; }    -> 매개변수가 있는 생성자
    this : 자기 자신의 인스턴스를 나타냄
  • 기본 생성자는 작성하지 않은 경우, 클래스 사용 시 JVM이 자동으로 기본 생성자 생성
    💡 매개변수가 있는 생성자가 있을 경우 기본생성자는 자동으로 생성하지 않음
public class Academy {
	private int studentNo;
	private String name;
    
	// 기본 생성자
	public Academy() {}
    
	//매개변수 있는 생성자
	public Academy(int studentNo, String name) {
		this.studentNo = studentNo;
		this.name = name;
		}
    }

✅ 오버로딩 : 한 클래스 내에 동일한 이름의 메소드를 여러 개 작성하는 기법
조건 : 같은 메소드 이름 + 다른 매개변수의 개수 또는 다른 매개변수 타입

  • 매개변수가 있는 생성자는 매개변수의 위치타입에 따라서 구분됨
ex)

public person(){} // 기본생성자

public Person(String name, int age) { // Stirng, int 타입형 생성자(밑에와 다른것임)
	this.name = name;
	this.age = age;
}

public Person(int age, String name) { // int, Stirng 타입형 생성자 (위에와 다른것임)
	this.name = name;
	this.age = age;
}

public Person(String paramName, int paraAge, double paramHeight, char paramGender) { // String, int, double, char 타입 생성자
		name = paramName;
		age = paraAge;
		height = paramHeight;
		gender = paramGender;
	}
    
    
// this() 생성자를 이용하면 추가로직을 작성하지 않고 활용할 수 있음.
// 생성자 내부에서 다른 생성자를 호출할 때 사용
public Person(String name, int age, char gender, String address) {
		this(name,age); // this 생성자는 생성자 코드에 첫번째 줄에만 선언할 수 있다. (하나만 사용가능)
		this.address = address;
		this.gender = gender;
	}

✅ 메소드

(1) : 수학의 함수와 비슷하며 호출을 통해 사용
(2) : 전달 값이 없는 상태로 호출하거나 어떤 값을 전달하여 호출
(3) : 함수 내에 작성된 연산 수행 후 반환 값/결과 값은 있거나 없을 수 있음

  • 메소드의 접근 제한자 = 필드의 접근 제한자와 동일함


  • 메소드 예약어


  • 메소드 반환형


  • 메소드 매개변수


  • 메소드 선언방법

    접근제한자 [예약어] 반환형 메소드명([매개변수선언]){기능구현}

💡 메소드의 접근 제한자는 대부분 public으로 함
💡 메소드명은 변수명이랑 명명규칙이 똑같음
(첫글자 소문자에 그 다음단어부터는 첫글자 대문자) = 카멜케이스 = 낙타표기법
ex) printMsg() , methodTest()
💡 반환형이 void가 아닌 경우 해당 타입에 맞는 return 값이 있어야함

  • 메소드의 종류 (4가지)
1. 매개변수가 x  + 리턴값 x
2. 매개변수가 o  + 리턴값 x
3. 매개변수가 x  + 리턴값 o
4. 매개변수가 o  + 리턴값 o
// ex)

	public void printMsg() { // 1. 반환형이 없고 매개변수도 없는 메소드 선언하기
		System.out.println("printMsg 실행함");
	}
    
    
    public int plus() { // 2. 반환형이 있고 매개변수 없는 메소드 구현하기
		int su = 100;
		int su2 = 200;
		return (su+su2); // 반환형을 처리하는 예약어를 사용 -> return 값 또는 변수
	}
    
    public void printSendMsg(String msg) { //3. 반환형이 없고 매개변수가 있는 메소드
		System.out.println("전달한 메세지 : "+msg+" 실행함");
	}
    
    public int complexNumber(int su1, int su2) { //4. 반환형이 있고 매개변수 있는 메소드
		return su1 * su2;
	}

  • 필드와 지역변수
// MethodTest 클래스
public void numberTest() { // 메소드 내부에서는 반복문, 조건문 다 사용 가능함
		this.count++; // 필드 카운트 (함수 호출할 때마다 누적되며 유지됨)
		int count = 0; // 지역변수 카운트 (함수 호출할때마다 초기화)
		for(int i=1; i<=10; i++) {
			if(i%2== 0) {
				System.out.print(i+" ");
			}       
		}
		System.out.println();
		System.out.println("필드출력 : "+this.count);
		System.out.println("지역변수 : "+this.count);
	}



// main 클래스
	public static void main(String[] args) {
		// 클래스에 선언된 메소드 호출하기
		// 클래스의 멤버메소드를 호출하려면 클래스를 객체로 생성해야함
		
	    MethodTest mt = new MethodTest();
	    

	    mt.numberTest(); // 같은 주소로 호출함    필드 1 지역변수 1
	    mt.numberTest(); // 같은 주소로 호출함    필드 2 지역변수 1
	    mt.numberTest(); // 같은 주소로 호출함    필드 3 지역변수 1
	    
	    new MethodTest().numberTest(); // (다른 주소로 호출함)주소가 새로 만들어짐 필드 1 지역변수 1 
	    new MethodTest().numberTest(); // (다른 주소로 호출함)주소가 새로 만들어짐 필드 1 지역변수 1
	    new MethodTest().numberTest(); // (다른 주소로 호출함)주소가 새로 만들어짐 필드 1 지역변수 1
	}

  • setter 메소드
    -> 필드에 변경할 값을 전달 받아서 필드 값을 변경하는 메소드

  • getter 메소드
    -> 필드에 기록된 값을 읽어서 요청한 쪽으로 읽은 값을 넘기는 메소드

💡 setter와 getter는 메소드를 만들 때 로직을 사용할 수 있음

자바빈 규약

  • 기본 생성자가 존재해야 한다
  • 멤버 변수의 접근제어자는 private 로 선언되어야 한다
  • 멤버 변수에 접근 가능한 gettersetter 메서드가 존재해야 한다.
  • gettersetter는 접근자가 public으로 선언되어야 한다.

// ex)
	public void setDepartment(String department) { // setter 메소드 (매개변수가 있고, 반환형이 없음)
		this.department = department;
	}
	
	public String getDepartment() { // getter 메소드 (매개변수가 없고 반환형이 있음)
		return this.department;
	}
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글