ㅅㅇ

java 개요 & 변수 & 객체 생성 및 메소드 구현 본문

SW_STUDY/Java

java 개요 & 변수 & 객체 생성 및 메소드 구현

SO__OS 2022. 7. 26. 02:46

java 개요 & 변수 & 객체 생성 및 메소드 구현 

python 과 다른 java 코드 만의 특성을 잘 파악하자.

0. Type of Cases - 관례적으로 

PascalCase                          -    class
UPPER_SNAKE_CASE       -    상수
camelCase                            -   변수, 메소드

 

1.  java 프로그램 실행 방식 

1-1 program 시작하는 방식

1) java에서 실행을 위한 필수 메소드

- 아래 클래스 안 {}  에서만

public static void main(String[] args) { }

// step01 디렉토리 하단에 Syntax1.java로 저장한 형식

package step01;
import org.junit.Test;
public class syntax1 {

	public static void main(String[] args) {
    // 여기서!
    
    }		
	}
}



2) 단위 test 인 jUnit framework 사용 시
=> main 메소드 없이도 실행 가능


@Test : main 특별한 정해진 메소드 없이도 실행 가능하게 하는 애노테이션

 

// program 시작하는 방식

package step01;

import org.junit.Test;

public class syntax1 {
	
	@Test
	public void main() {
	System.out.println("콘솔창에 출력");		
	}

}

 

3) server 즉 web 사용 시
  => server와 brower 로 실행. (main 메소드 필요없이)

 

 

1-2 컴파일 및 실행 명령어

 

1) 컴파일 명령어
 - 이클립스에선 정상 저장
 >javac Syntax1.java
 
 정상 컴파일 시에 Syntax1.class 라는 bytecode 자동 생성
 
 2) 실행 명령어
 - 실행 단축키 등 사용 : ctrl + F11
 >java Syntax1

 

** outline 을 항상 확인 잘 하자.

outline 에 빨간 색 - private, 초록색 - public

 

1. 변수 선언 및 호출 방법

1) 변수 선언 및 초기화

 

- 변수란 

  데이터 표현으로 실제 환경 상에서 데이터 사용을 위해서의 선행 조건이다.

 

- 파이썬과 달리, 변수 선언 시 타입 지정이 필수이다. 그리고 지정한 타입 외 다른 타입의 값은 변수에 넣을 수 없다.

  즉, name 변수에는 선언한 문자열 string 타입만 가능


- 쌍따옴표만이 가능하며,  끝을 뜻하는 세미클론 필수이다.


타입 변수명; // 선언만. 추후 초기화 가능.
타입 변수명 = 값; // 선언 및 초기화

 

String name = "김혜경";

int age;
age = 10;

 

2. 클래스 생성 및 객체 생성

2.1 클래스 생성 및 메소드 개발

 

2.1.1  access modifier

 

- 기능 : 접근 범위 제한


- 종류
     - public : 외부 클래스 access 가능 의미
     - private : 외부 클래스에서 access 불가 의미

 

 

2.1.2 변수 구분 : 선언 위치에 따른 

 

(1) 멤버 변수
   - class{} 괄호 내부에 선언되는 변수
   - 객체 생성 시 객체를 구성하는 데이터


   - 객체 생성 시 생성, 객체가 소멸 시 삭제

 

   - 객체 생성 시에 heap에 생성

   - 객체 생성 시 각 타입 별 기본값으로 자동 초기화


   - 객체 참조 변수로 호출 가능
   - 생성자가 호출되서 실행될 때 자동 메모리 생성

 

  - 종류
        - instance 변수
                - 객체 생성 필수
                - 참조 변수로 호출 필수
        - static 변수
                - 객체 생성 옵션
                - 참조 변수로 호출도 가능 / class 명으로 호출 / 동일한 클래스내에선 변수명만으로 호출
 

(2) 로컬 변수
   - 메소드의 () 또는 {} 내부에 선언

 

   - 사용전 초기화 필수 (멤버 변수와 달리 자동 초기화 되지 않음.)

 

   - 메소드 호출시에만 생성되었다가 메소드 종료시 자동 소멸 휘발

   - 일시적인 사용 변수    =>  선언된 메소드 내에서만 사용 가능한 변수

   - temporary, local, automatic, stack 라는 용어로 쓴다.

 

   - 저장되는 메모리 공간 stack

 

 

2.1.2 변수 구분 : 타입에 따른 

 

(1) 기본 타입
   - 8가지 내장된 built in type
   - int ...


 (2) 참조 타입 
   - class 를 기반으로 한 타입
   - String, People ...

 

 

2.1.3 기본 예제 : 이클립스 get, set 메소드 

 

1)  멤버 변수는 관례적으로 상단에 구현해준다.

 

2) 멤버변수명과 로컬 변수명이 동일한 경우 구분 키워드 사용


            => 멤버 변수에 로컬 변수값을 대입하기 위해,

                  메소드 내 멤버 변수를 작성할 때는

                  this.멤버변수 표현으로 구분해준다.

 

 

/* generate 자동완성으로 작성되었다.*/

package model.domain;

public class Car {

	private String carName; //멤버변수는 관례적으로 상단에 구현해준다.  
	private int carNumber; //멤버변수
	
	// generate
	// 이클립스가 관려적 규칙에 맞춰, 자동안성 해줌. 
	public String getCarName() {
		return carName;
	}
	public void setCarName(String carName) { // => carName 로컬 변수
		this.carName = carName; //멤버 변수에 로컬 변수값 대입. 멤버 변수라는 것을 표시하기 위해 앞에 this 붙임.
	}
	
	public int getCarNumber() {
		return carNumber;
	}
	public void setCarNumber(int carNumber) { // => carNumber 로컬 변수
		this.carNumber = carNumber; // 멤버 변수에 로컬 변수값 대입
	}
	
	public void print() {
		String msg = "Car"; // 로컬 변수
		System.out.println(msg);
	}

}

 

 

2.1.3 People 예제 :  People class 생성

 

python

함수 : 클래스와 무관하게 개발되는 기능

메소드 : class 내부에서 개발되는 기능

 

java      ** py 와 다르다는 것을 알자.

메소드 : class 내부에서 개발되는 기능

 

 

[ 코드설명 ]

- 이름, 나이 정보 관련된 정보가 담긴 class People 

 

- name 과 age 변수가 있으며, 외부 클래스에서 호출하여 사용하려고 한다.

 

- 이때,

무작정 name 과 age 를 호출하는 것이 아니라,

조건에 따른 처리를 하도록 하는 메소드를 생성하고 이를 호출하여 처리하도록 할 것이다.

 

- 이를 위해 멤버 변수 name, age는 private 로 은닉한다.

 

- age 의 경우,

   setAge 메소드를 통해 값을 받고, 

   양수 1살 이상의 값인지 조건문을 확인 한 후 

   만족할 시에는 해당 값을 age 변수에 넣고

   만약 그렇지 않다면, 오류 메시지를 출력할 것이다.

 

  그리고 getAge 메소드를 통해 age 변수 값을 반환할 것이다.

 

- name 의 경우, 외부에서 받는 setName 과 반환하는 getName 을 만들 것이다.

 

 

package model.domain;

public class People {
	// name 멤버 변수 선언
	private String name;
	// age 멤버 변수 선언  (- + 32bit 정수)
	private int age; // private : 외부 클래스에서 호출 불가
	

	/* age 값을 받는 메소드. 하나의 숫자를 받아서
	 * 0을 초과한 양수인지 확인 후에 (조건 확인 후)
	 * 유효한 경우 age 변수에 대입
	 * 무효한 경우 오류 메시지 출력. 호출한 쪽으로 값을 주진 않고 => void
	 * */
	public void setAge(int newAge) {
		if(newAge > 0) {
			age = newAge;
		}else {
			System.out.println("무효");
		}	
	}
    
	// private 으로 외부에 은닉해 놓은 age 변수값 반환하는 메소드
	public int getAge() {
		return age;		
	}
	
    
	// name 변수값 수정
	public void setName(String name) {
    
		//name = name; // error
        
		// 멤버 변수와 로컬 변수명이 동일한 경우 구분을 위해 this 키워드 필수
		this.name = name;
	}

	// name 변수값 반환
	public String getName() {
		return name;	
	}
}

 

 

2.2 객체 생성 및 호출

 

2.2.1 생성자(Constructor)

   - 객체 생성시에만 호출되는 필수 요소
   - 객체 시점에 멤버 변수들 값 특정 데이터로 명시적인 초기화 가능

public class Syntax1Variable {
// 생성자. 이걸 코딩 안 해도, 필수 이기에 컴파일러가 자동 생성한다.
Syntax1Variable(){
		//모든 멤버 변수들 공간을 메모리에 생성 및 기본 초기화 및 명시적인 초기화 실행
	System.out.println("기본 생성자"); // 멤버 구성 마무리 후 실행되는 마지막 로직
	}
    }

1) 필수 구성요소

     - 개발자가 코딩하지 않을 경우에도 기본 형태의 생성자 자동 생성

               => 기본 형태란 () 즉 parameter가 없는 생성자 의미
     - 필요에 의해 개발자가 여러 생성자 개발 가능
               단, parameter 는 달라야 함. => 오버로딩

 

- 다중 정의 (overloading)

   - 하나의 함수가 하나의 기능만을 구현해야 하는 c언어와 달리

     자바는 하나의 메소드 이름으로 여러 기능을 구현할 수 있다. 이러한 의미로 oveloading 이라 한다.

   - 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도

     매개변수의 개수 또는 타입이 다르다면, 같은 이름을 사용해서 정의할 수 있다.

        => 이름 동일.  단, parameter 가 다름.

    - 단, 리턴값만 다른 것은 오버로딩할 수 없다.


   - 하나의 클래스에서 메소드끼리, 생성자끼리에 적용되는 메카니즘

 

   - 사용자가 편리하게 해주는 support

   - 예를 들어, println 메소드를 예로 쓸 수 있다.

     println 의 인자 값으로 int, String 등 다양한 타입의 매개변수를 집어넣어도 그 함수들이 어떻게 실행되는지는 모르지만       이는 일단 출력된다. 여러 상황의 출력의 기능들이 println 이라는 하나의 이름으로 정의가 된 것이다.

 

 

2) 문법 - 객체 생성 시에 호출되는 문법
       - class 명과 100% 동일
       - 반환 영역 자체가 존재하지 않는다.


3) 기능
     - 객체 생성이 주목적

 

4) 생성 문법

     new : 객체 생성 돕는 키워드

new 생성자([..]);

 

2.2.2 객체 생성 

  People p1 = new People();

 

(1) 문법

 :     타입 변수명 = new 생성자();

 

(2) 변수 p1 : 참조 변수 (reference 변수)

          :  해당 변수로 객체가 보유한 모든 멤버들 access 호출 가능 

          :  객체 참조 변수, 객체가 메소리에 생성되어 저장된 위치값 보유
          :  객체가 보유한 모든 변수와 메소드 사용 가능하게 하는 변수

       

      - p1 이 실제 보유한 데이터
            - 생성된 People 객체의 주소값

// 시스템 메모리에 저장된 객체의 주소값 출력
System.out.println(p1); // 주소 값 //model.domain.People@7de26db8

 

 

(3) 멤버 변수 name, age => 메모리 확보

               - 위 코드와 이어서 설명한다면, 메모리 확보 를 다음과 같이 말할 수 있다.

                      문자열 저장 가능한 메모리 - name
                      숫자 저장 가능한 메모리 - age

 

 

(4) java에선 객체 생성이 우선이다.

  객체 생성시, name, age 라는 이름과 타입이 제한된 구조의 메모리 확보

 

(5) People 타입이 가능 사유
    - 사전에 People 클래스 가 존재하기 때문


(6) 객체 생성 사유
     - 해당 클래스가 보유한 멤버 즉 데이터 사용을 위한 메모리 생성

  
(7) 메소드 - 기능 구현

 

 

2.2.2 People 예제 : p1 객체 생성와 멤버 변수 및 메소드 호출 

 

package step01;

// 객체 생성 줄에서 ctrl+shift+o 시 import 문자 자동 생성됨.
import model.domain.People;

public class Syntax2PeopleTest {
	
	public static void main(String[] args) {
    
        	// People 객체 생성 // p1 : 객체주소값 보유한 참조 변수
                // 멤버 변수들로만 객체 생성 즉, name 과 age 정보 활용을 위한 메모리 확보
		People p1 = new People();
		People p2 = new People();
		
		// 시스템 메모리에 저장된 객체의 주소값 출력
		System.out.println(p1); // 주소 값 //model.domain.People@7de26db8
		System.out.println(p2); 
		
        	// 멤버 변수 호출
        	// 클래스 내부에 있는 참조 변수을 통해 값을 넣음. 확보된 메모리에 값을 넣은 것.
        	// 만약, 멤버변수가 public 으로 선언되었다면 해당 명령은 가능하나, 
        	// 현재 private 로 선언되었기에 에러난다.
            
		//p1.name = "연아"; 
		// System.out.println(age);	// 에러
			
       		// age 값을 담는 메소드 호출
		p1.setAge(-30); // 음수로 무효 라는 오류 메시지 출력
		p1.setAge(30);  // 양수로 조건을 만족하기에 People 클래스 멤버 변수 age 에 담김.
		
		// age 값을 반환하는 메소드 호출
        	// 호출하여 반환값을 받아 
        	// main 내 로컬변수 age 에 담는다.
		int age = p1.getAge(); 
		System.out.println(age); //30 // 메소드호출 반환값을 담은 main 내 로컬 변수age를 통해 사용자 원하는 대로 사용
		
		
	}

}

 

 

2.3 lombok 코드

 

-  lombok 을 활용한 코드 다이어트 를 할 수 있어야 한다.

package model.domain;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter

public class Engine {
	private String engineCompanyName;
	private int cc;
	private String engineName;
	

}



 


[최종 정리]

 

1. java 프로그램 개발 기준 : class 단위

 


2. 소스 구조

package 선언구;
import  package 활용구;

public class class명{
멤버 변수;
메소드([argument_list]){
//로직 구현
}
}


3. 객체 생성 문법

타입 변수 = new 생성자();


4. 멤버 변수, 메소드 호출 하는 문법


    1단계 : 객체 생성 필수. 이게 항상 먼저.
    2단계 : 객체 참조 변수로 메소드나 멤버 변수 호출.

                주소값이 담겨져 있는 참조 변수를 통해.

5. 명명 규칙
    1) class명 : 파스칼 케이스 권장
    2) 변수, 메소드 : 카멜 케이스 권장

6. 변수 
- 선언된 위치에 따른 변수
       멤버 - 생성되는 객체를 구성하는 구성
       로컬 - 메소드 호출시에만 생성 및 메소드 종료시 자동 휘발 

- 타입에 따른 변수

       기본 타입
       참조 타입

7. 주의 사항
           멤버변수명과 로컬 변수명이 동일한 경우   =>   구분 키워드 this.멤버변수 표현으로 구분