[JAVA]_5일차

전희주·2023년 4월 11일
0

JAVA

목록 보기
5/24

클래스(class) 복습

  • 1) 자바 언어의 실행하기 위한 최소 단위

  • 2) oop(object oriented programming)

  • 3) 객체(object)

    • 현실 세계에 존재하는 모든 사물 의미
      UML 이용 (Unified Modeling Language)
    • 2가지 요소: 속성, 동작
  • 4) 프로그래밍 개발 process

    • 주문 - 분석 - 설계 - 구현 - test - 배포
    • 분석 : 객체, 속성, 동작
    • 설계 : 클래스, 변수, 메서드
  • 5) 클래스 문법: public class 클래스명 { }

    • 클래스명.java: 첫글자 대문자, 특수문자는 $, _ 사용 가능
    • 클래스 ==> main 메서드가 없음 , 핸들링 class 하나 더 생성해서 실행 필
    • 핸들링 클래스를 통해 heap 메모리에 할당
      • 클래스 로딩 (객체 생성) , new 이용
      • 값 저장 (직접 접근 or 생성자 사용)
      • 값 조회
public class 클래스명 {
   // 변수(인스턴스 변수, 필드, 멤버 변수) => 자료형(data) 지정
   // 생성자 => 기능 처리 
   // 메서드 (인스턴스 메서드, 멤버 메서드)  => 기능 처리 
}
==> main 메서드가 없음 , 핸들링 class 하나 더 생성해서 실행 필 
  • 객체 생성
    • 1) new 키워드 이용
    • 2) 모든 클래스는 반드시 객체 생성 (new 키워드 사용)이 필요하다.
      클래스 생성 문법: 클래스명 변수 명 = new 클래스명( );
      예) Cat c = new Cat(“야옹이", 2, "암컷");

  • 생성자 호출 코드

    • 모든 클래스는 기본 생성자 자동 제공 (매개변수 없는 형태로)
    • 예) public Cat( ) { }
      명시적으로 (매개변수 지정) 생성자 만들면 기본 생성자는 자동 제공되지 않는다.
  • 오버로딩 생성자

    • 하나의 클래스에 여러 개의 생성자 지정(명칭 중복 사용)이 가능하다. 단, 구별하기 위해 인자 리스트(파라미터들)의 자료형, 개수, 순서를 상이하게 해야 한다.

클래스 다이어그램

https://www.nextree.co.kr/p6753/

  • 100번지 주소 값을 참조하는 곳?
    • Cat 자신:
    • this 키워드 => heap 메모리에 할당된 100번지가 가지고있는 인스턴스 변수 의미
    • Cat 외부: c변수


이클립스 파라미터 없는 기본 생성자 만들기


이클립스 파라미터를 가진 생성자 만들기

package p01;

public class Cat {
	
	String name; 
	int age;
	String sex;
	
	// 오버로딩 생성자를 통해 객체 생성 가능 
	// 모든 정보를 모르는 경우 아래의 생성자를 활용
	// 반드시 기본 생성자는 명시적으로 지정하는 습관을 들이자. 
	public Cat() {
		// 기본 생성자 
	} 
	
	// 이름과 나이 정보만 알고있는 경우 아래의 생성자를 활용
	public Cat(String name, int age) {
		this.name = name; // 인자로 들어온 로컬변수명과 인스턴스명이 동일 => this 사용 필 
		this.age = age;
	}

	// 정보를 다 알고있는 경우 아래의 생성자를 활용
	public Cat(String name, int age, String sex) {
		this.name = name;
		this.age = age;
		this.sex = sex;
	}


}

this 키워드

  • 1) 의미?
    • heap 메모리에 생성된 자신의 instance 를 참조 (100번지)
    • 용도 2가지
      • 인스턴스 변수 명(n)과 로컬 변수 명(n)이 동일한 경우
      • 오버로딩 생성자 호출 시 (생성자에서 다른 생성자 호출시)
        this ( ); => public Cat () { }
        this ("야옹이", 2); => public Cat (String n, int a){ };
      • 반드시 생성자 첫 line에 기재해야 한다
  • this를 통해 파라미터 없는 기본 생성자가 다른 생성자 호출 가능
package p02;

public class Cat {
	

	String name;
	int age;
	String sex;
	
	
	public Cat() {
		this("야옹", 2); // 생성자  public Cat(String name, int age) 호출 
		System.out.println("Cat 기본 생성자");
	}


	public Cat(String name, int age) {
		/*  객체지향적(중복x, 재사용가능)으로 this 사용할 수 있다~ 
		 *  세 번째 생성자의 중복되는 내용 없앨 수 있다. 
		 *  this.name = name;
		    this.age = age;
		 * */
		this(name, age, "암컷" ); // this 키워드로 생성자 호출 시 반드시 첫 라인에 기재 필 
		System.out.println("Cat (String name, int age) 생성자");
		
	}


	public Cat(String name, int age, String sex) {
		this.name = name;
		this.age = age;
		this.sex = sex;
	}

	

}

package p02;

public class TestCat {

	public static void main(String[] args) {
		
		// 3번째 생성자 이용 
		// public Cat(String name, int age, String sex)
		// new 키워드를 통한 생성자 호출 및 값 초기화 
		Cat c1 = new Cat ("야옹1",2,"암컷"); 
		Cat c2 = new Cat ("야옹2",1,"암컷"); 
		Cat c3 = new Cat ("야옹3",5,"암컷"); 
		Cat c4 = new Cat ("야옹4",4,"암컷"); 
		Cat c5 = new Cat ("야옹5",2,"암컷"); 
		
		// 2번째 생성자 이용 - 성별을 지정하지 않았지만, 암컷까지도 저장하자. 
		// 고정된 값("암컷")은 매번 지정하지 말고, 클래스.java에서 this 키워드써서 인자로 넘기자 
		// this(name, age, "암컷" ); 
		// public Cat(String name, int age)
		Cat x1 = new Cat ("야옹1",2); 
		Cat x2 = new Cat ("야옹2",1); 
		Cat x3 = new Cat ("야옹3",5); 
		Cat x4 = new Cat ("야옹4",4); 
		Cat x5 = new Cat ("야옹5",2); 
		
		
	}


}

메서드(method)

ref. https://velog.io/@yoondgu/Java-%ED%81%B4%EB%9E%98%EC%8A%A4%ED%95%84%EB%93%9C-%EB%A9%94%EC%86%8C%EB%93%9C-%EC%83%9D%EC%84%B1%EC%9E%90-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC

  • 1) 기능 처리 담당
  • 2) 클래스의 멤버 중 하나
  • 3) 문법:
public 리턴타입 메서드명 ([변수..]) {
문장; 
[return;]

}

  • 4) 특징:
    -반드시 호출해야 한다.
    -호출되어 실행이 끝나면 호출한 곳으로 돌아간다

    • 가) 객체 생성
      A a = new A();

    • 나) 메서드 접근 (호출)

      • a.x();

    • 예)

      public class MethodEx02 {
      	public static int div() {
      		int a = 10, b = 5;
      		int result = a / b;
      		int result2 = a * b;
      		return result;	// 호출한 곳으로 값 반환
      //		return result2; // 컴파일 에러
      	}
      
      	public static void main(String[] args) {
      		System.out.println(div()); // 메소드 호출 후 리턴값 출력
      	}
      }
  • 5) 기능에 따른 메서드 종류 (4)

  • 공통 사항

    • 인자 값: 여러 개 가능
    • 리턴 값: 💥 반드시 한 개
  • 리턴 x, 매개변수 x

    public 리턴타입 메서드명() { 
    문장; 
    }
  • 리턴 x, 매개변수 o

    public 리턴타입 메서드명(변수) { 
    문장; 
    }
  • 리턴 o, 매개변수 x

    public 리턴타입 메서드명() { 
    문장; 
    return;
    }
  • 리턴 o, 매개변수 o

    public 리턴타입 메서드명(변수) { 
    문장; 
    return; 
    }
package p03;

public class Test {

	// 1. 파라미터 없고 리턴 없는 형태 
	public void a() {
		System.out.println("a 메서드");
	}
	
	// 2. 파라미터 있고 리턴 없는 형태 
	public void b (int n) {
		System.out.println("b 메서드" + n);
	}
	
	public void b2 (int n, String n2) {
		System.out.println("b2 메서드" + n + "\t" + n2); 
	}
	
	// 3. 파라미터 없고 리턴 있는 형태 
	public int c()
	{
		System.out.println("c 메서드");
		return 100; 
	}
	
	public String c2()
	{
		System.out.println("c2 메서드");
		return "AAAA"; 
	}
	
	// 4. 파라미터 있고 리턴 있는 형태 
	
	public int d(int n, int n2)
	{
		System.out.println("d 메서드");
		return n+n2; 
	}
	
	public int d2(int n, int n2)
	{
		System.out.println("d 메서드");
		return n+n2; 
	}
	
	
	
	
	
}
package p03;

public class TestMain {

	public static void main(String[] args) {
	
		// a 메서드 호출
		Test t = new Test(); 
		t.a();
		// 리턴 값이 없는 메서드 출력 불가 System.out.println(t.a());
		
		// b 메서드 호출 
		t.b(10);
		t.b2(10, "AAA");
		
		// c 메서드 호출 
		// 리턴 값을 저장하는 변수가 필요하다
		int n = t.c(); 
		System.out.println(n);
		System.out.println(t.c());
		
		String n2 = t.c2();
		System.out.println(n2);
		System.out.println(t.c2());
		
		// d 메서드 호출 
		int m = t.d(10, 20);
		System.out.println(m);
		System.out.println(t.d(10, 20));
		
		
		
	}

}
  • 메서드 흐름
    • 매개변수와 인자의 자료형과 갯수가 일치해야함
    • 매개변수 자료형이 string이면 인자값도 string
    • mm.add() => caller method
    • long add(); => worker method

  • 메소드 호출
package p04;

public class Test {

	// 1. 파라미터 없고 리턴 없는 형태
	String name; 
	
	public void a() {
		System.out.println("a 메서드");
		this.name = "aa"; 
		b(); // // 같은 클래스 내에서 함수 호출 시 객체 생성 안해도 됨 
		
		this.b(); 
	}
	
	// 2. 파라미터 있고 리턴 없는 형태 
	public void b () {
		System.out.println("b 메서드" );
	}
	
	public void b2 (int n, String n2) {
		System.out.println("b2 메서드" + n + "\t" + n2); 
	}
	
	// 3. 파라미터 없고 리턴 있는 형태 
	public int c()
	{
		System.out.println("c 메서드");
		return 100; 
	}
	
	public String c2()
	{
		System.out.println("c2 메서드");
		return "AAAA"; 
	}
	
	// 4. 파라미터 있고 리턴 있는 형태 
	
	public int d(int n, int n2)
	{
		System.out.println("d 메서드");
		return n+n2; 
	}
	
	public int d2(int n, int n2)
	{
		System.out.println("d 메서드");
		return n+n2; 
	}
	
	
	
	
	
}
package p04;

public class TestMain {

	public static void main(String[] args) {
		
		Test t = new Test(); // 다른 클래스 내에서 함수 호출 시 new를 통한 객체 생성 필  
		t.a(); 

	}

}
  • 메소드 매개변수

public class MethodEx03 {
	public static void sum(int a) { // int a 매개변수
		int sum = 0;
		for (int i = 0; i <= a; i++) { // a = 15
			sum += i;
		}
		System.out.println(sum);
	}

	public static void sum(int a, int b) { // int a, b 매개변수 / 메소드 오버로딩
		int sum = 0; 
		for (int i = a; i <= b; i++) { // a = 5, b = 20
			sum += i;
		}
		System.out.println(sum);
	}

	public static void main(String[] args) {
		sum(15); // sum(int a); 호출 및 값 전달
		sum(5, 20); // sum(int a, b); 호출 및 값 전달
	}
}

가변인자(variable arguments)

  • 1) 기본적인 메서드 호출
    • 반드시 인자리스트(argument list)가 일치해야 한다
      • 인자리스트(argument list)의 갯수, 타입, 순서
  • 2) 가변인자를 사용한 호출
    • 타입만 일치하면 호출 가능

메서드이름(데이터타입… 변수이름) { }

  • 데이터타입 뒤에 점을 세 개 찍음으로써 가변 길이 인자 선언한다.
  • 점 세 개는 앞에 선언한 타입으로 배열을 생성하여 가변 길이 인자를 처리하겠다는 의미이다.
public void a (int ... n) {
 // int ... n => 배열로 저장 
}

a(10); 
a(10,20); 
a(10,20,30...); 
package p05;

import java.util.Arrays;

// main이 없는 class는 public 기재하면 안됨



class Test{
	// 가변인자 ==> 내부적으로 배열로 관리됨
	// int 타입으로 배열을 생성하여 가변 길이 인자를 처리
	public void a(int...n) {
		System.out.println(Arrays.toString(n));
	}
	
	public void b (int n, String...n2) {
	System.out.print(n);
	System.out.println(Arrays.toString(n2));

	}
}

// public 지정자는 main 함수를 지닌 클래스만 사용 가능







public class TestMain {
	public static void main(String[] args) {
		
		Test t = new Test(); // 객체(인스턴스) 생성
		t.a(10);
		t.a(10,20);
		t.a(10,20,30);
	
		t.b(1, "A");
		t.b(1, "A", "B");
		t.b(1, "A", "B", "C");
	}

}

오버로딩(overloading) 메서드

  • 메소드명 동일

  • 매개변수의 자료형, 개수, 순서를 다르게 하여 선언

  • 생성자 오버로딩과 메소드 오버로딩 비교

    • 공통점) 동일한 이름을 갖고(재사용성 고려) 매개변수의 자료형, 개수, 순서를 다르게 하여 선언하여야 한다.
    • 주의) 리턴 타입은 오버로딩과 무관함 (인자 리스트로만 구분)
public void a() { }
//  public int a() { } 호출시 구분 불가 => 에러 
// 즉 리턴타입은 오버로딩과 무관함 (인자리스트로만 구분)
public void a(int n) { }
public void a(String n) { }
public void a(int n, String n2) { }
public void a(String n, int n2) { }
  • 실습
package p06;


class Test2{
	
	// 오버로딩 메서드
	public void a() {}; 
	// 리턴 타입은 오버로딩과 무관함 (인자 리스트로만 구분)
	  // public int a() {}; =>  추후 t.a();로 호출 시 식별 불가 
	public void a(int n) {}; 
	public void a(String n) {}; 
	public void a(int n, String n2) {}; 
	public void a(String n2, int n) {}; 

}


public class TestMain {

	public static void main(String[] args) {
		
		// 대표적인 오버로딩 메서드 println(), print()  
		System.out.println(10);
		System.out.println("aaa"); 
	}

}

오버로딩(overloading) 생성자

  • 1) 개념: 하나의 클래스 안에 동일 이름(클래스명)의 생성자가 여러 번 정의할 수 있다.

  • 각각의 생성자를 식별하기 위해, 인자리스트의 개수,자료형, 순서가 달라야 한다.

  • Cat 클래스의 재사용성이 증가

    public Cat() { }
    public Cat(int n) { }
    public Cat(String n) { }
    public Cat(int n, String n2) { }
    public Cat(String n, int n2) { }
    

    Call by Value Reference

  • ref. https://bcp0109.tistory.com/360
    https://velog.io/@ahnick/Java-Call-by-Value-Call-by-Reference

  • 메서드 호출 시 전달하는 파라미터 (인자 값)

    • 인자 값: 기본형, 참조형
  • call by value

  • call by reference



0개의 댓글