본문 바로가기
Back-End/Java

Java(3)

by newny 2023. 3. 15.
반응형

메소드 (함수, 프로시저)

메소드의 종류

1. 리턴값이 없는 메소드

  • void 키워드를 사용한다
  • return; → 리턴값이 없다는 뜻
  • return은 생략 가능하다

    → 매개값이 없는 경우

public static void test1() {
    System.out.println("JAVA");
    return;
		// void 리턴값이 없는 메소드
    // return -> 함수를 호출한 시점으로 되돌아 간다
    // 마지막 return 명령어는 생략 가능하다
}

 
    →매개값이 있는 경우

public static void test4(int a, int b, int c) {
    System.out.println(a+b+c);
		// 매개변수(parameter)의 자료형은 생략할 수 없다
    // 매개변수는 자료형을 개별적으로 선언해야한다
}

 
 
2. 리턴값이 있는 메소드

  • void 자리에 리턴타입을 써줘야한다
  • 리턴값은 한개만 가능하다
public static String test2 (int a) {
  if(a%2 == 0) {
    return  "짝수";
  } else {
    return  "홀수";
  }
}

public static void main(String[] args) {
	String str = test2(7);
  System.out.println(str);
}

 
3. 재귀적 메소드 호출

public static long fact (int n) {
  if(n==0) {
    return 1;
  } else {
    return n*fact(n-1);
  }
}

public static void main(String[] args) {
	System.out.println(fact(7));
}

 

메소드 오버로딩(Overloading)

  • 매개변수의 갯수, 자료형, 순서를 이용하여 메소드명을 중복 사용가능
  • 예) Math.abs() 메소드 → 자료형을 다르게하여 메소드 오버로딩
  • 리턴타입이 다르다고해도 매개변수의 갯수와 타입, 순서가 같으면 에러남
  • → 메소드 오버로딩은 매개변수의 갯수와 타입, 순서에만 관련이 있음
public static void hap (int a) {
  System.out.println(a);
}
public static void hap (int a, int b) { //매개변수 갯수
	System.out.println(a + b);
}
public static void hap (double a) { //매개변수 타입
  System.out.println(a);
}
public static void hap (double a, double b) { //매개변수 타입, 갯수
  System.out.println(a + b);
}

public static void hap (int a, double b) {
  System.out.println(a + b);
}
public static void hap (double a, int b) { //매개변수 순서
  System.out.println(a + b);
}

public static int hap (double a, double b) { // 에러!!
  return a + b;
}

 

메소드 호출방식

Call by value
값에 의한 호출방식

int[] num = {10, 20, 30};
test1(num[0], num[2]); //10, 30 값을 넘김

public static void test1(int a, int b) {
  System.out.println(a);
  System.out.println(b);
}

 
Call by reference
참조(주소)에 의한 호출방식
예) → Arrays.sort()메소드의 매개값

int[] num = {10, 20, 30};
test2(num); //배열 자체를 넘김

public static void test2(int[] a) {
  for(int i=0; i<a.length; i++) {
    System.out.println(a[i]);
  }
}

 

main() 메소드

  • 메인메소드는 사용자가 임의로 호출할 수 없음
  • main() 메소드는 가상머신이 호출함
  • 명령 프롬프트 또는 터미널에서 호출할 때 값을 줄 수 있음
public class MainTest {
	public static void main(String[] args) { //argument string
		for(int i=0; i<args.length; i++) {
			System.out.println(args[i]);
		}
	}
}

 

객체지향 프로그래밍의 특징

  • 캡슐화 → 접근제한자
  • 상속 → 코드의 재사용성, 유지 보수 시간을 최소화
  • 다형성 → 자동 타입 변환, 재정의(오버라이딩)기술 필요 → 상속, 인터페이스 구현

 

클래스와 객체(Object)

클래스

  • 프로그램에서 객체를 생성하기 위한 일종의 설계도
  • 클래스 명의 첫 글자는 대문자로 쓴다
  • 클래스 구성멤버 : 멤버변수(field), 메소드(method)
System.out.println(Math.E); //Math 클래스의 멤버변수
System.out.println(Math.abs(-3)); //Math 클래스의 메소드

 

객체

  • 설계도로 구현한 모든 대상
  • 클래스의 타입으로 선언된 것
  • 클래스 인스턴스라고도 부름

 

인스턴스

  • 클래스를 통해서 구현해야할 대상(객체)이 실제로 구현된 구체적인 실체
  • 객체가 메모리에 할당되어 실제 사용될 때를 인스턴스라고 부름

 

new 연산자

  • 클래스를 사용하기위해 객체를 인스턴스화 하여 메모리를 할당함
  • RAM(Random Access Memory)의 heap 영역에 메모리가 할당되고 주소값이 발생된다
  • → RAM (Random Access Memory): 주 기억장치의 대표적 장치, 컴퓨터가 켜져있는 동안만 작동 (휘발성 메모리)

[형식]

new 클래스명();

 

접근제한자 (Access Modifier)

private

클래스 내부에서만 접근 가능, 은닉할 수 있음
멤버변수는 대부분 private로 지정
 

package-private

접근제한자를 생략하게되면 package-private 접근제한을 갖음(default) , 같은 패키지 내에서만 접근 가능
package-private는 접근 제한자가 아니라 접근 제한자가 붙지 않은 상태를 의미함
 

protected

같은 패키지의 클래스 또는 다른 패키지의 상속관계에 있는 자식 클래스에서 접근 가능
 

public

모든 프로젝트 내에서 접근 가능
메소드는 대부분 public으로 지정
 

생성자(Constructor)

생성자는 메소드처럼 생겼고, 오버로딩 또한 가능하다. 하지만 생성자를 메소드라 부르지 않는다. 그 이유는 아래와 같다.

  1. 생성자는 new 연산자와 함께 메모리를 할당할 때 사용한다.
  2. 생성자는 반환값이 존재하지 않는다. (void, 반환타입 사용할 수 없음)
  3. 생성자의 이름은 메소드와는 달리 반드시 클래스 이름과 동일해야한다.

 

기본생성자

  • 개발자가 클래스 안에 생성자를 따로 선언하지 않았을 경우 기본 생성자가 생성됨
  • 기본 생성자는 해당 클래스의 접근제한자를 따라감

 

객체의 소멸

자바는 객체 생성자 코드를 지원하지만, 제거 코드는 지원하지 않는다. 객체를 제거하고 싶다면 그 객체의 모든 참조를 끊으면 된다. 왜냐하면 참조가 모두 끊긴 객체는 가비지 컬렉터가 자동으로 삭제하기 때문이다.

반응형

'Back-End > Java' 카테고리의 다른 글

Java 과제 - 표준편차 구하기  (0) 2023.03.15
Java 과제 - 정렬 알고리즘 코드 작성  (0) 2023.03.14
Java 예제(1)  (0) 2023.03.14

댓글