public, protected, default(생략), private(같은 클래스 안에서만 작동하게하는 기능)
- 위의 명령어가 무엇이든 다 동작하기는 한다
아래는 public과 private의 설정 차이이다
Greeting.hi();에서 위의 클래스 Greeting 안에 hi메소드가 public이면 작동. private면 미작동 에러
class Greeting{
**public** static void hi() {
// private static void hi() {
System.out.println("Hi");
}
}
public class method08 {
public static void main(String[] args) {
**Greeting**.hi(); // 위의 hi메소드가 public이면 작동. private면 미작동 에러
}
}
public과 private의 예
스마트폰 안에 오만가지 선들이 있는데 이것을 사용자가 만지면 안되고 알 필요도 없음 반대로 사용자가 컨트롤 해야할 볼륨키, 전원키 등은 외부로 나와줘야한다
public : 외부로 노출되어 있는 버튼들(유저가 사용가능)
private : 내부 선들(유저 사용불가)
전체코드
// JAVA method - 8. 부록 - Access level modifiers
//
// Access level modifiers : 외부에서의 접근권한 설정
class Greeting{
public static void hi() {
// private static void hi() {
System.out.println("Hi");
}
}
public class method08 {
public static void main(String[] args) {
// public 자리에 올 수 있는 다른 명령어들 : 외부에서 접근하는 레벨을 지정하는 부분
// public, protected, default(생략), private(같은 클래스 안에서만 작동하게하는 기능)
// 위의 명령어가 무엇이든 다 동작하기는 한다
Greeting.hi(); // 위의 hi메소드가 public이면 작동. private면 미작동 에러
// protected & default는 경제적이지 않음
// public과 private의 예
// 스마트폰 안에 오만가지 선들이 있는데 이것을 사용자가 만지면 안되고 알 필요도 없음
// 반대로 사용자가 컨트롤 해야할 볼륨키, 전원키 등은 외부로 나와줘야한다
// public : 외부로 노출되어 있는 버튼들(유저가 사용가능)
// private : 내부 선들(유저 사용불가)
}
}
단순 반복만 대체가 아닌 함수 괄호 안에 입력값에 따라 메소드가 다르게 작동하게 하는 방법?
- 해당 메소드 안 println() 안에 변수명으로 바꿔주면, 밖에서 해당 메소드 호출하고 ()안에 입력되는 값에 따라 출력된다
- 아래 코드표 참조
메인 메소드 main(String[] args) {의 디테일한 의미
main이라는 메소드 있어야 자바가 프로그램을 호출한다는 약속
String뒤에 []는 문자열 배열
args는 자바가 메인메소드를 실행할 때, 입력해주는 입력값이 args를 통해서 들어가게됨
public static void printTwoTimes(String text) { 이 코드를 자바가 어떻게 받아들일까?
- printTwoTimes라는 메소드를 정의하고 있고, 이 메소드 ()안에 들어온 첫번째 값은 반드시 String타입으로 받으며, {}안에서 text라는 변수의 값이 되겠구나라고 생각한다
- 이 메소드 밖에서 printTwoTimes 메소드를 호출하면 printTwoTimes()안에 첫째값을 "a"이구나 그럼 자바는 text 값은 {}안에서 "a"이구나라고 생각
- printTwoTimes메소드 안에 "a”를 변수명 text로 변경하면, 메소드 데이터를 추가해야할 것을 더이상 수정할 필요가 없게됨
- 메소드명(데이터타입 변수명) {메소드 작동내용}
만약 위의 구분표시----를 다른걸로 메소드처럼 일괄 변환하고 싶다면?(두번째 변수 추가)
public static void printTwoTimes2(String text, String delimiter) {처럼 두번째 파라미터 추가와 메소드 밖에서 호출할 메소드 ()에도 인자를 추가해주면 된다
// delimiter 매개변수를 추가함
public static void printTwoTimes2(String text, String delimiter) {
System.out.println(delimiter); // delimiter 구분자라는 의미
System.out.println(text);
System.out.println(text);
매개변수(parameter) : 아래 새로 만든 메소드 안에 변수명을 매개변수한다
메소드 밖에서 메소드를 사용하는 쪽으로 주입한 값을 메소드 안으로 흘려보내주는 매개자라고 해서 매개변수
인자(arguement) : 해당 메소드 밖에서 호출하는 메소드명 ()안에 입력값을 인자라 한다
public class method04 {
public static void main(String[] args) { // main이라는 메소드 있어야 자바가 프로그램을 호출한다는 약속
// String뒤에 []는 문자열 배열. args는 자바가 메인메소드를 실행할 때, 입력해주는 입력값이 args를 통해서 들어가게됨
printTwoTimes("a");
// 1억번 코드 반복
printTwoTimes("b");
// 1억번 코드 반복
printTwoTimes2("a","----"); // delimiter(구분자) 적용 메소드 호출
printTwoTimes2("a","****");
printTwoTimes2("b","%%%%");
printTwoTimes2("b","!!!!");
// 위의 함수 안에 입력 된 값을 인자(argument)
}
// 아래 text, delimiter와 같은 변수를 파라미터(parameter)라고 부름.
// 메소드 밖에서 메소드를 사용하는 쪽으로 주입한 값을 메소드 안으로 흘려보내주는 매개자라고 해서 매개변수
public static void printTwoTimes(String text) {// 이 코드를 자바가 어떻게 받아들일까?
System.out.println("----"); // printTwoTimes라는 메소드를 정의하고 있고
System.out.println("a"); // 이 메소드 ()안에 들어온 첫번째 값은 반드시 String타입으로 받으며
System.out.println(text); // {}안에서 text라는 변수의 값이 되겠구나라고 생각한다
} // 메소드명(데이터타입 변수명) {메소드 작동내용}
// 이 메소드 밖에서 printTwoTimes 메소드를 호출하면 printTwoTimes()안에 첫째값을 "a"이구나
// 그럼 자바는 text 값은 {}안에서 "a"이구나라고 생각
// printTwoTimes메소드 안에 "a'를 변수명 text로 변경하면, 추가되거나 수정할 메소드 데이터를 더이상 할 필요가 없게됨
// 만약 위의 구분표시----를 다른걸로 메소드처럼 일괄 변환하고 싶다면?
public static void printTwoTimes2(String text, String delimiter) {
System.out.println(delimiter); // delimiter 구분자라는 의미
System.out.println(text); //
System.out.println(text);
}
}
코드의 양이 많아지면 정리하고 싶게 될 것인데, 연관된 코드를 모아서 그루핑(grouping)하고 이름을 붙이면 이것이 함수(function)이고 자바에서는 메소드라고 부름
이미 만들어 놓은 메소드를 사용해서 똑같은 코드를 다시 작성할 필요 없이 재사용 가능
JAVA method - 2. 이미 익숙한 메소드
메인 메소드를 쓰면서 이미 메소드를 사용해옴
main도 메인이라는 메소드. 처음부터 끝까지 하나의 메소드
println()도 입력값을 모니터로 출력하는 메소드
math.floor(1.1)); // 내림 메소드. 1.1을 1.0으로
JAVA method - 3. 메소드의 기본 형식
반복되는 1억줄의 코드를 하나씩 변경해야한다면?
연관된 코드를 그루핑해서 이름을 붙이자(메소드 작성)
아래처럼 반복되는 코드를 따로 메소드를 만들어서 관리(수정)할 때도 편하고 코드도 줄어들어서 필히 사용해야할 기능
public static void printTwoTimesA() {
이 줄을 보고 자바는 이런 메소드 있고 이런 내용을 가졌구나 하고 기억해둠
System.out.println("A"); // 둘이 같은 코드
printTwoTimesA();
여기서 코드수정시 이 메소드를 쓴 모든 코드에 적용되어 엄청난 생산성업
public class method010203 {
public static void printTwoTimesA() {// 이 줄울 보고 자바는 이런 메소드 있고 이런 내용을 가졌구나
System.out.println("-"); // 하고 기억해둠
System.out.println("A"); // 여기서 코드수정시 이 메소드를 쓴 모든 코드에 적용되어 엄청난 생산성업
System.out.println("A");
}
public static void main(String[] args) { // 여기 main도 메인이라는 메소드. 처음부터 끝까지
System.out.println("hello"); // println도 입력값을 모니터로 출력해주는 메소드
System.out.println(Math.floor(1.1)); // 내림 메소드. 1.1을 1.0으로
// 1억번 반복
printTwoTimesA();
// // 1억번 반복
// System.out.println("-");
// System.out.println("A");
// System.out.println("A");
// // 1억번 반복
// System.out.println("-");
// System.out.println("A");
// System.out.println("A"); // 이 반복되는 코드들을 위에 만들어둔 메소드 printTwoTimesA로 변경
// 1억번 반복 // 같은 일하게 된다
printTwoTimesA();
// 1억번 반복
printTwoTimesA();
// 이클립스 refactoring 기능
// 매소드로 만들기를 원하는 부분을 드래그 범위 지정-우클릭 refactoring 클릭-우측 extract method 클릭
// 프리뷰 기능을 이용하여 어찌 바뀔껀지 미리 확인가능
}
}
※ 이클립스 리팩토링refactoring : 메소드화 기능
이클립스 refactoring기능을 이용하면 해당 부분을 쉽게 메소드화 가능하다
[메소드로 만들기를 원하는 부분을 드래그 범위 지정] - [우클릭 refactoring 클릭] - [우측 extract method 클릭]