객체

유재훈·2022년 10월 24일
0

JAVA_Study

목록 보기
2/3
post-thumbnail

객체 지향 언어

  • 현실세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있으며, 발생하는 모든 사건들은 객체간의 상호작용으로 이 개념을 컴퓨터로 옮겨 놓아 만들어낸 것이 객체지향 언어

자바에서의 객체(Object)

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

클래스

클래스의 등장 배경

  • 객체의 특성에 대한 정의를 한 것으로 캡슐화를 통해 기능을 포함한 개념,사물이나 개념의 공통 요소를 추상화(abstraction)하여 정의
  • ex) 제품의 설계도, 빵 틀

추상화(abstraction)

  • 유연성을 확보하기 위헤 구체적인 것은 제거한다는 의미
  • 프로그램에서 필요한 공통점을 추출하고, 불필요한 공통점을 제거하는 과정

추상화 예시

public class Member {
	private String memberName; //이름
	private int age; //나이
	private char gender; //성별
	private String phone; //전화번호
	private String email; //주소
   }

객체

  • 현실에 존재하는 독립적이면서 하나로 취급되는 사물이나 개념으로 객체 지향 언어에서 객체의 개념은 클래스에 정의된 내용대로 메모리에 할당된 결과물(Object)

객체(Instance)의 할당

  • new 연산자와 생성자를 사용하여 객체 생성 시 heap 메모리 공간에 서로 다른 자료형의 데이터가 연속으로 나열/할당된 객체 공간

캡슐화

캡슐화 원칙

  1. 클래스의 맴버 변수에 대한 접근 권한은 private을 원칙으로 한다.
  2. 클래스의 맴버 변수에 대한 연산처리를 목적으로 하는 함수들을 클레스 내부에 작성한다.
  3. 맴버 함수는 클래스 밖에서 접근할 수 있도록 publi으로 설정한다.

클래스

클래스 선언

public class Student {

	// 상태 - 클래스영역에 작성
	private String name;
	private char gender;
	private int age;
	
    //생성자
    public Student() {}
    
	// 행위
	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return this.name;
	}
	public void setGender(char gender) {
		this.gender = gender;
	}
	public char getGender() {
		return this.gender;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getAge() {
		return this.age;
	}
  }

필드(Field)

필드 접근제한자

  • public : 어디서든 접근 가능
  • protected : 같은 패키지에서 접근 가능. 자식클래스인 경우, 다른 패키지에서도 접근 가능
  • default(package) : 아무것도 작성하지 않은 경우. 같은 패키지에서 접근 가능
  • priavte : 해당클래스 밖에서 직접 접근 불가 (getter,setter 사용하여 간접접근)

필드 예약어 - static

  • 같은 타입의 여러 객체가 공유할 목적의 필드에 사용하며,프로그램 start시에 정적 메모리 영역에 자동 할당되는 멤버에 적용
  • static 표현식
public class Academy{
	private static int temp;
  }

필드 예약어 - final

  • 하나의 값만 계속 저장해야 하는 변수에 사용하는 예약어
  • final 표현식
public class Academy{
	private fianl int temp = 100;
  }

필드(Field) - 초기화 블럭

인스턴스 블럭({})

  • 인스턴스 변수를 초기화 시키는 블럭으로 객체 생성시 마다 초기화

static(클래스)블럭(static{})

  • static필드를 초기화 시키는 블럭으로 프로그램 시작 시 한 번만 초기화

필드(Field) - 초기화 순서

  • 클래스 변수 : JVM 기본값 -> 명시적 초기값 -> 클래스 초기화블록 초기값
  • 인스턴스 변수 : JVM기본값 -> 명시적 초기값 -> 인스턴스 초기화 블럭 초기값 -> 생성자를 통한 초기값

전역변수

  • 클래스 영역에 작성
  • 여러 메소드에서 사용가능
  • 클래스변수 Class Variable static변수
  • static키워드가 있다. 공유목적
  • 클래스당 하나만 선언.
  • 클래스명.클래스변수 (객체를 통해 접근하지 않는다.)

인스턴스 변수

  • Instance Variable non-static변수 멤버변수
  • static키워드가 없다.
  • 생성된 객체(instance)마다 선언.
  • 객체참조변수.필드명

지역변수

  • 메소드 영역에 작성(매개변수도 지역변수다.)
  • 메소드 내부에서만 사용가능

변수별 생명주기(Life Cycle)

  • 지역변수 : 메소드 호출시 ~ 메소드 리턴시
  • 인스턴스변수 : 객체생성시 ~ 객체제거시(GC)
  • 클래스변수 : 해당클래스최초사용시 ~ 프로그램종료시

getter

  • 필드를 제어하는 기본메소드
  • 필드값을 제공하는 메소드
  • public 필드타입 get필드명(){ return 필드값; }

setter

  • 필드를 제어하는 기본메소드
  • 필드값을 설정하는 메소드
  • public void set필드명(필드타입 변수) { this.필드 = 변수; }

예제

// 클래스변수 
	// 보통 공유목적의 상수로 사용한다. public static final
	// 상수인 경우 초기화 필수
	public static final double WIDTH = 5.7;
	public static final double HEIGHT = 17.3;
	
	// 인스턴스변수
	private String owner;
	private String number;
	
	// getter/setter
	public String getOwner() {
		return this.owner;
	}
	public void setOwner(String owner) {
		this.owner = owner;
	}
	public String number() {
		return this.number;
	}
	public void setNumber(String number) {
		this.number = number;
	}

생성자(Constructor)

  • 객체가 new연산자를 통해 Heap메모리 영역에 할당될 때 객체 안에서 만들어지는 필드 초기화
  • 생성자는 일종의 메소드로, 전달된 초기 값을 받아서 객체의 필드에 기록
  • 생성자의 선언은 메소드 선언과 유사하나 반환 값이 없으며 생성자명을 클래스명과 똑같이 지정해주어야 함

생성자 표현식

기본 생성자

  • 작성하지 않은 경우, 클래스 사용 시 JVM이 자동으로 기본 생성자 생성
  • 상속 시 자식객체에서 부모생성자를 호출. 없으면 오류!

매개변수 생성자

  • 객체 생성시 전달받은 값으로 객체를 초기화 하기 위해 사용
  • 매개변수 생성자 작성 시 JVM이 기본 생성자를 자동으로 생성해주지 않음
  • 상속에서 사용 시 반드시 기본 생성자를 작성
  • 오버로딩을 이용하여 작성

오버로딩

  • 한 클래스 내에 동일한 이름의 메소드를 여러개 작성하는 기법
  • 동일한 기능을 수행하는데, 매개변수의 타입을 다르게 제공해야 할때 사용

오버로딩 조건

  • 메소드이름이 같고 매개변수 선언부(개수, 타입, 순서)가 어떻게든 달라야 한다.
  • 매개변수명, 접근제한자, 리턴타입은 개의치 않는다.
	public void test() {}
	public void test(int a) {}
	public void test(int a, int b) {}
	public void test(String str) {}
	public void test(String str, int x) {}
	public void test(int x, String str) {}

메소드(Method)

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

인스턴스메소드

  • non-static 메소드
  • 멤버메소드
  • 인스턴스변수/클래스변수 모두 사용이 가능
  • 현재객체를 의미하는 숨은 this참조변수를 가진다.

클래스메소드

  • static 메소드
  • 객체를 만들지 않고, 클래스명.test()으로 호출!
  • 클래스변수만 접근 가능
  • this 참조변수가 없다.

재귀함수 메소드

  • 스스로를 다시 호출하는 메소드
  • 반복호출을 통해 효율적인 코드작성이 가능하다.
  • 종료조건을 제시하지 못하면 무한반복으로 인해 StackOverflowError발생

0개의 댓글