TIL. 객체지향개념과 메소드 그리고 클래스

hyuko·2023년 1월 4일
0

Java

목록 보기
15/26

메소드


  • 메소드란?

    하나의 일정한 행동들을 정리해서 모아 놓은 것을 함수라고 한다.
    자바에서는 모든 함수는 클래스안에서 정의 되기에 일반 함수는 존재 하지 않는다.
    그렇기 때문에 자바에서 함수란 메소드를 말한다.

  • 메소드의 기본 형태

public static 반환형 메소드명 (매개변수) {
	실행문;
}

메소드의 특징

  1. 메소드는 반환형을 가지고 있을 수도 없을 수도 있다.
  2. 메소드는 매개변수를 가지고 있을 수도 없을 수도 있다.
  3. 일반적으로는 메소드명을 똑같이 쓸 수 없다.
    단! 매개변수가 달라지게 되면 메소드명을 똑같이 쓸 수 있다.(메소드 오버로딩)
  4. 반환은 하나의 반환만을 한다.
  5. 매개변수는 여러가지 사용이 가능하다.
  6. 각각의 메소드는 다른 지역이기 때문에 같은 변수명을 사용이 가능하다.
  • 메소드의 호이스팅

    클래스는 항상 컴파일 과정에서 정의되어 있는 녀석들을 먼저 정의 한 후에
    메인함수를 실행 시키기 때문에 메소드가 메인함수의 위쪽이나 밑쪽이나 관계없이
    어디에서든 쓸 수 있다.

  • 메소드 예제 코드

// 매개변수: x,  반환: x
public static void method1() {
	System.out.println("단순 실행");
	System.out.println();
}
	
// 매개변수: int num 하나 , 반환: x // 지역변수
public static void method2(int num) {
	System.out.println("num: " + num);
	System.out.println();
}

// 매개변수: int num, int num2 두개, 반환 : x
public static void method3(int num, int num2) {
	System.out.println("num: " + num);
	System.out.println("num2: " + num2);
	System.out.println();
}

// 매개변수: x , 반환형: String
public static String method4() {
	return "데이터 반환";
}
	
public static String method5(int age) {
	return age + "살";
}

public static void main(String[] args) {
	method1(); // 메소드(함수) 호출
	
    method2(1);
    
    method3(100,200);
    
    System.out.println(method4());
	System.out.println();
		
	String data1 = method4();
		
	System.out.println(data1);
	System.out.println();
		
	System.out.println(method5(20));
	System.out.println();
 }
  • 코드 실행시 콘솔화면

  • 메소드 오버로딩 예제코드
public static void ov1() {
	System.out.println("매개변수 없음");
}
	
public static void ov1(int num) {
	System.out.println("int 매개변수 하나");
}
	
public static void ov1(int num, String b) {
	System.out.println("int 먼저 그다음 String");
}

public static void main(String[] args) {
		
	ov1();
	ov1(10);
	ov1(10,"b");
}
  • 예제 코드 실행 화면

위와 같이 메소드 오버로딩이 가능한 이유는, 각각의 메소드명에 들어가는
매개변수가 다르기 때문에 호출당시에 적용할 매개변수에 따라 구분이 가능해서
쓸 수가 있다.


객체지향언어


  • 객체지향언어 : 순차지향언어에 오브젝트 개념이 추가된 것이다.

  • 객체 : 객체란 세상에 존재하는 모든 것을 의미한다.

프로그래밍 관점에서는 객체들의 관계성을 사용하여 순차적으로 수행되는
프로그램내에서 객체들 간에 관계를 형성하여 프로그램을 동작하게한다.

객체 = 데이터 + 기능

ex) 객체 = 자동차
데이터(변수) = 색상, 모델명, 제조사명
기능(메소드) = 엔진가동, 브레이크작동, 기어변속, 에어컨실행등

객체지향언어의 특징

  1. 상속: 부모와 자식 관계 (데이터의 관계성)
    상위 클래스에서 모든 것을 상속받아서 사용하는 것 (확장의 개념)

  2. 캡슐화: 데이터와 기능을 보호, 외부로부터 접근은 차단하고 권한 또는
    절차 없이 데이터를 변경 또는 기능수행을 할 수 없게 한다. (데이터의 은닉성)
    (데이터들을 관련이 있는 집단별로 응집하여 캡슐에 담아둔다고 생각)

  3. 추상화: 추상적인 요소들을 묶어서 분류하는 것(데이터의 구조화)
    여러가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용

  4. 다형성: 객체의 기능이 다양한 형태를 가질 수 있다(상속과 깊은 관계를 가지게 된다.)
    부모 클래스로 부터 상속받은 데이터와 기능을 자식 클래스에서 재정의해서
    사용가능하다. (메소드 오버로딩, 오버라이드, 형변환 등)

객체지향언어 장점

(절차지향언어의 상대적인 부분)
  1. 재사용성: 상속을 통해서 코드의 재사용을 높일 수 있다.
  2. 생산성 향상: 클래스 단위의 부품들을 조립
  3. 유지보수의 우수성: 구조화 된 소스코드 클래스 단위로 소스 코드를 관리할 수 있다.

객체지향언어 단점

  1. 객체를 세분화하여 설계해야한다.
  2. 실행 속도가 절차지향언어 대비 느리다.
  3. 상속으로 인하여 관계가 많이 형성되면 코딩의 난이도가 높아진다.

클래스

클래스란?

클래스 (참조 자료형) : 객체에 대하여 정의해 놓은 설계도 혹은 틀

  • 클래스의 기본적인 틀 : 클래스는 변수와 메소드로 이루어져 있다.

object객체와 인스턴스

object 객체: 클래스를 통하여 구현 할 수 있는 모든 대상
즉, 해당 클래스로 구현한 인스턴스를 대표하는 의미 (메모리가 할당이 되지 않은 상태)

인스턴스 : 객체가 실제로 구현이 된 것, 존재하는 것 (실제로 메모리 공간을 할당 받은 상태)

클래스의 호출


클래스명 변수명 = new 클래스명();
자료형   변수명    값 (생성자)

자료형인 클래스가 컴파일 시점에 스택이라는 공간에 할당이 된다.
그 클래스를 선언한 것이 변수명이고 그 변수명에 새로운 생성자를 생성해서
대입을 하는 구조이다.

이때 , 생성자는 동적 메모리 영역에서 할당을 받게 되고 , 그 메모리의 주소를
스택영역에 있는 변수에 담아준다.

그래서 선언한 변수명. 을 붙이면 해당 생성자의 주소 값에 참조가 가능하고
그 생성자에 있는 변수, 메소드 등을 이용할 수 있다.

※ 생성자의 특징:
1. 생성자는 클래스명과 일치한다(절대 변하지 않는다.)
2. 형태는 메소드 형태이다.
3. 기본적으로 정의가 되어야 쓸 수 있지만 , 생성자는 기본적으로 생략이 되어있어 사용가능하다.

  • 클래스 코드 예제

// User 클래스정의

public class User {
	String username;
    String password;
    String name;
    String email;
    
    // 기본 생성자
    User() {}
    
    // 모든 정보를 담는 생성자
    User(String username, String password, String name, String email) {
    	this.username = username;
        this.password = password;
        this.name = name;
        this.email = email;
    }
    
    // 담아진 정보를 출력하는 메소드
    void printUserInfo() {
    	System.out.println("아이디: " + username);
        System.out.println("비밀번호: " + password);
        System.out.println("이름: " + name);
        System.out.println("이메일: " + email);
        System.out.println();
    }
}

================================================

// User 클래스를 쓸 Main 클래스

public class UserMain {
	public static void main(String[] args) {
    	User userA = new User();
        //  생성 될 당시에 값을 대입
        User userB = new User("sunsin12", "1234", "이순신", +  "sunsin12@gmail.com")
        
        // 직접 변수를 참조해서 대입
        userA.username = "hong12";
        userA.password = "1212";
        userA.name = "홍길동";
        userA.email = "hong12@gmail.com";
        
        userA.printUserInfo();
        userB.printUserInfo();
    }
}
  • 예제코드 실행시 콘솔화면



profile
백엔드 개발자 준비중

0개의 댓글