ㅅㅇ
java 개요 & 변수 & 객체 생성 및 메소드 구현 본문
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.멤버변수 표현으로 구분
'SW_STUDY > Java' 카테고리의 다른 글
List 생성 두 가지 방법 new ArrayList<> vs Arrays.asList() (0) | 2023.06.26 |
---|---|
String 리터럴 생성 방식 VS String 객체 생성 방식 (0) | 2023.06.26 |
Wrapper Class 이란? (0) | 2023.06.26 |
JDK & eclipse 설치 및 환경변수 설정 (0) | 2022.07.25 |