자바 기초 프로그래밍 3일차

awarduuu·2023년 3월 6일
0

230306

복습


1. 메소드 특징

  • 객체 안에 선언되어 객체가 가지고 있는 기능이다.
  • 반드시 class내부에 선언된다.
  • 호출해서 사용한다.(호출되기 전에는 실행 안됨.)
  • 재귀호출가능(자기 자신 안에서 자신을 호출)
  • Method 마지막 구현부에서 return 할 수 있다.
    (특정한 값을 호출한 주체에게 return 한다.)
  • 재사용 목적 – 코드의 중복을 피할 수 있다

2. 메소드 작성법

   접근제한자 [기타제한자]  리턴타입 메소드이름(데이터타입 변수이름, 데이터타입 변수이름,...){

		[return 가지고갈값] ; // 리턴타입이 void가 아닌경우
   }
  • 접근제한자(access modifier) public > protected > 생략 > private

public -> 어디서나 아무나 접근
protected -> 상속관계라면 어디서나 접근
생략 -> 같은 package내에서 아무나 접근
private -> 하나의 class 내부에서만 접근

  • 기타제한자 : static , final , abstract , synchronized

  • 리턴타입
    - void : 리턴값이 없다.
    - 기본형(primitiveType)
    - 객체타입(참조형)

    리턴 타입은 반드시 하나만 작성!
    기본형과 객체타입은 반드시 메소드 마지막에 return 값 ;이 있어야한다.

  • 메소드이름 : identifier 작성규칙에 의해 개발자가 만드는 이름.

  • 괄호안을 매개변수=인수=파라미터=아규먼트 : 호출하는사람이 가지고 들어오는 값을 담을 변수 선언.

  • {} 안을 메소드 구현부 = body : 필요한 기능 작성한다.


3. 메소드 호출 방법

2) => 3) => 1) 순서대로 해본다.

1) 객체를 생성해서 접근하는 방법

: 호출하려는 메소드를 감싸고 있는 클래스를 생성한다.

클래스이름 변수이름 = new 클래스이름();
변수이름.메소드이름(인수값, 인수값,....); [호출한 메소드가 리턴값이 없을때]
리턴타입 변수 = 변수이름.메소드이름(인수값, 인수값,....); [만약 호출한메소드가 리턴값이 있을때]

2) static붙은 메소드 호출하는 방법

- 객체생성 하지 않고 
  **클래스이름.메소드이름(인수값, ....);**

  ex)  Math.random();
       Integer.parseInt(문자열);

3) 같은클래스 내부에서 메소드 호출방법

    : this.메소드이름(인수값, 인수값....);  //this. 은 생략도 가능하다.
    

4. static

※ keyword : 사전 초기화 (메모리 할당)되어 공유 가능

1) class 앞에

class 앞에는 올 수 없다. (단, Inner class에는 사용가능) 
ex) static class Test{ } ⇨ X 

2) 변수 앞에

㉠ 전역변수 앞에만 사용가능 ex) static int i; 
㉡ 객체생성 없이 외부에서 class이름.변수이름 호출가능
	ex) System.in; System.out;
    
㉢ static변수는 같은 class들이 공유하는 공유변수이다

3) 메소드 앞에

㉠ 객체생성 없이 class이름.mehtod이름( [값,값,…] ); 호출가능
	ex) Integer.parseInt(); Math.random();

㉡ static method는 일반(static이 없는) method 호출 안됨. 
㉢ static method는 static method만 호출 가능. 
㉣ static method안에서 this 키워드 사용 안됨. 

⇨ 같은 class 내에 static method 호출할 때 => method이름( [값, ... ] ); 

4) ★ static 블럭 ★

ex) static{
       기능 구현 ;
    }
   ⇨ class 내부에 선언되어 main method보다 먼저 실행된다.
   ⇨ method, 생성자 등의 영역 안에서는 선언 될 수 없다
   

Static 예시 코드1

package day03;

public class StaticExam {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("***********메인 시작입니다.**************");
		
		// static cc call
		B.cc(0);

		System.out.println("***********메인 종료입니다.**************");
	}
}

/**
 * 하나의 ~.java 문서 안에는 클래스 여러개 작성 가능!
 * 1. public class는 단 한개만 가능(반드시 public class 이름으로 파일명이 만들어져야 하기 때문)
 * 2. main 메소드는 public 클래스 안에 작성한다.
 **/

class B {
	public void aa() {
		System.out.println("aa() call...");
		
		bb("안녕");
		this.bb("하이");
		
		dd("되니?", 5);
		this.dd("되니?", 5); // 권장하지 않는 방법
		B.dd("되니?", 5);
	}
	
	public int bb(String s) {
		System.out.println("bb(String s) call...");
		
		return 4;
	}
	
	public static void cc(int i) {
		System.out.println("cc(int i) call...");
//		this.dd();
		B.dd("Hello", 3);
		
//		aa(); // static 메소드 안에서 non-static 호출 안됨
	}
	
	public static char dd(String s, int i) {
		System.out.println("dd(String s, int i) call...");
		return 'A';
	}
}

class A {
	
}

Static 예시 코드2

package day03;

public class StaticVariableExam {
	// Field 선언 = 전역변수 = 멤버필드
	int i=10; // 인스턴스 필드, 즉 객체를 생성해야만 접근 가능
	static int j=4; // 객체를 생성하지 않고 접근 가능, 공유 변수
	
	// non-static 영역에서 static, this 모두 가능
	public void aa() {
		System.out.println(i);
		System.out.println(this.i);
		
		System.out.println(j);
		System.out.println(this.j);
		System.out.println(StaticVariableExam.j);
	}
	
	
	public static void bb() {

//		System.out.println(i); non static i 는 접근 못함
//		System.out.println(this.i); static에서 this 사용x
		
		System.out.println(j);
//		System.out.println(this.j); static에서 this 사용x
		System.out.println(StaticVariableExam.j);
	
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("--------non-static variable TEST--------");
		StaticVariableExam se1 = new StaticVariableExam();
		StaticVariableExam se2 = new StaticVariableExam();
		StaticVariableExam se3 = new StaticVariableExam();
		
		System.out.println(se1);
		System.out.println(se2);
		System.out.println(se3);
		
		// 값 변경
		se1.i = 100;
		System.out.println("--------값 변경 후-------");
		System.out.println("se1.i = "+se1.i); // 이 값만 변경 (주소에 할당된 인스턴스 주소가 다르기 때문)
		System.out.println("se2.i = "+se2.i);
		System.out.println("se3.i = "+se3.i);
		
		System.out.println("--------static variable TEST--------");
		
		System.out.println(se1);
		System.out.println(se2);
		System.out.println(se3);
		
		// 값 변경
//		se1.j = 100;
		StaticVariableExam.j = 50; // 모두 같은 주소를 가리키고 있다. (공유 값)
		System.out.println("--------값 변경 후-------");
		System.out.println("se1.j = "+se1.j);
		System.out.println("se2.j = "+se2.j);
		System.out.println("se3.j = "+se3.j);
		
	}

}

5. this

현재 생성된 객체를 뜻함

1) this 변수이름

현재 객체의 전역변수를 뜻함 (지역변수와 전역변수이름이 같을 때 주로 사용한다.)

2) this 메소드이름(값, 값, ...)

현재 객체의 메소드를 호출

3) this(값, 값, ...)

현재 객체의 다른 생성자 호출

반드시 생성자 구현부 첫줄에서만 가능하다!

6. Overloading (오버로딩)

① 하나의 class 내부에 method이름이 같은 method 여러 개 있는 것
② 하나의 method이름을 가지고 기능을 다르게 구현하는 것 ⇨ 이용자 편의
③ 작성규칙

modifier(접근제한자) 같아도 달라도 상관없음.
returnType 같아도 달라도 상관없음.
method이름 반드시 같아야 한다.
단, 인수는 무조건 인수의 순서 or Type or 개수가(셋 중하나가) 달라야 한다.

※ 인수를 0개 이상 전달할 수 있는 문법

public void aa(int i){} // 정수 한 개 무조건

public void aa(int ...i){} //정수 0개 이상 허용

7. Constructor (생성자)

① 특별한 method이다.
② 반드시 method이름이 class이름과 같다. (method이름이 대문자로 시작)
③ 일반적인 method선언과 같지만 returnType 자리가 없다.
⇨ modifier class이름( [ dataType 변수이름, ... ] ){ }
④ 객체가 생성(new)되는 시점에 딱 한번 호출한다.
⑤ java의 모든 객체는 반드시 한 개 이상의 생성자를 갖는다.
⑥ Overloading이 가능하다.
⑦ 프로그래머가 생성자를 하나도 작성하지 않으면 default 생성자가 만들어진다.
⇨ modifier class이름( ){ }

객체 생성되는 시점에 하는 일

㉠ 전역변수를 0에 준하는 값으로 초기화 ex) int i; ⇨ 0 
㉡ 전역변수를 명시적 초기화 (프로그래머가 직접 값을 입력) ex) int i=5; 
㉢ 생성자 구현부 실행

같은 class내에서 다른 생성자 호출 방법

this([값, 값, ... ]); ⇨ 반드시 생성자 구현부 첫 번째 줄에서만 가능

Constructor 예시 코드

package day03;

public class ConstructorExam {

	public ConstructorExam() {
		this("하이");
//		this("3"); 하나의 생성자에서는 하나의 생성자만 호출 가능
		System.out.println();
	}
	
	public ConstructorExam(int i) {
		System.out.println(2);
	}
	
	public ConstructorExam(String s) {
		this(3); // no parameter 생성자 -> String 생성자 -> int 생성자 순으로 호출
		System.out.println(3);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
	}

}

생성자는 왜 쓰나? 어떨 때 써야할까? => 관리의 용이성!

객체가 생성되는 시점에서 해야 할 일이 있다면 생성자에 작성해놓으면 호출하지 않아도 자동 호출되어 일을 하게 된다.

  • 객체의 데이터를 초기화할 때 가장 많이 사용
  • 데이터 로딩, 환경 세팅 등에도 사용
// 학생을 관리하고 싶다!

String names[] = new int [25];
int ages[] = new int [25];
String addrs = new String [25];

// 관리가 너무 어렵다! -> 속성을 관리할 객체를 만들자는 생각!
// VO(Value Object), DTO(Data Transfer Object), Domain
class Student {
	// 학생이 가질수 있는 속성 선언 = Field
    String name;
    int ages;
    String addrs;
    
    Student(String name, int ages, Spring addrs){
    	this.name = name;
        this.ages = ages;
        this.addrs = addrs;
    };
}

Student st1 = new Student("희정", "30", "서울");

// **객체타입도 배열로 관리할 수 있다.
// 학생 = Student 5명을 관리할 배열 만들자.
Student [] stArr = new Student[5]; // Student 객체가 들어갈 배열 방 5개를 만든것

stArr[0] = new Student("희정", 20, "서울");

profile
선한 영향력을 만드는 개발자

0개의 댓글