JavaRush /Java Blog /Random-KO /자바의 메소드

자바의 메소드

Random-KO 그룹에 게시되었습니다
많은 사람들이 들어본 흥미로운 원리가 하나 있습니다. 그것은 "분열과 정복"이라고 불립니다. 이 원칙은 정치 등 인간 생활의 여러 영역에서 사용됩니다. 이는 국가 내에서 다수의 이질적인 부분을 분할하여 이들 부분 간의 적대감을 선동하고 사용하는 것을 의미합니다. 즉, 잠재적으로 권력에 위협을 가하는 사람들 사이에 갈등을 조성하는 것입니다. 하지만 우리는 프로그래머이기 때문에 이 원칙의 기술적 해석에만 관심이 있습니다. 그리고 그 내용은 다음과 같습니다. “분할 정복의 원칙은 큰 문제를 초보적인 문제가 될 때까지 작은 문제로 나누는 것입니다. 그런 다음 순차적으로 문제를 해결하고 모든 것을 하나의 전체 시스템으로 결합해야 합니다. 이 프로그램은 주어진 문제를 해결해야 합니다.” 즉, 큰 문제를 작은 문제로 쪼개기만 하면 해결할 수 있는 문제가 아닙니다. 그런 다음 솔루션을 하나의 큰 솔루션으로 수집합니다. 이 간단하고 유용한 원칙을 따르기 위해 Java 프로그래밍에서는 메소드를 사용합니다. Java의 메소드 - 1예를 들어 로봇 복서를 만들고 있습니다. 그가 잘 움직이고, 정확한 공격을 수행하고, 약점을 찾아 적을 감시하는 것이 우리에게 중요합니다. 이 모든 것을 하나의 main 메소드 로 작성하는 것은 어색할 것입니다 . 그렇죠? 모든 것을 하나의 방법으로 설명하면 다음과 같습니다.
метод main() {
// Описание действий шага вперед
подача напряжения в отдельные модули;
поднятие ноги;
перевод в другую точку;
поставить ногу;
перенести вес на другую ногу;
если (противникАтакует()) {
        	// Описание действий уклонения робота.
        	...
} еслиНет {
        	// Описание действий обманного атакующего удара.
        	...
}
// Описание действий шага назад
...
}
프로그램의 다른 곳에서 앞으로 나아가거나 걷어차기를 사용해야 하는 경우 어떻게 해야 합니까? 모든 작업을 다시 설명하시겠습니까? 맞지 않습니다. 반복되는 대사가 너무 많아서 길을 잃기 쉽습니다. 로봇 단계를 수행할 별도의 모듈에 작업 세부 정보에 대한 설명을 배치해야 합니다. 그리고 한 줄로 메소드를 호출할 수 있습니다. 이 같은:
метод шагВперед() {
// Описание действий шага вперед
  	подача напряжения в отдельные модули;
  	поднятие ноги;
  	перевод в другую точку;
  	поставить ногу;
  	перенести вес на другую ногу;
}

метод уклонение() {
  	// Действия для уклонения
  	...
}

метод обманныйАтакующийУдар() {
  	// Действия для удара
  	...
}

метод шагНазад() {
  	// Действия для шага назад
  	...
}

метод противникАтакует() {
	// Робот проверяет атакует ли противник
}

метод main() {
	шагВперед();
	если (противникАтакует()) {
        	уклонение();
	} еслиНет {
  	  обманныйАтакующийУдар();
	}
	шагНазад();
}
이제 우리는 분리된 로봇 기능과 간결하고 명확한 main() 메소드를 갖게 되었습니다 . 나머지 메소드도 기능별로 나눌 수 있습니다. 예를 들어 deceptiveAttackingStrike 는 deceptiveMovement , Leg movement , Attack 메소드로 나눌 수 있습니다 . 그리고 궁극적으로 일련의 기본 작업을 얻기 위해 더 간단한 작업에 할당됩니다. 자, 이제 Java가 수용할 수 있는 형식으로 모든 것을 아름답게 작성해 보겠습니다.
public static void stepForward() {
  	    // Многострочный code, описывающий
  	    // действия робота для выполнения шага
  	    System.out.println("The robot takes a step forward");
}

public static void evasion() {
  	    // Действия для уклонения
  	    System.out.println("Robot shy of impact");
}

public static void deceptiveAttackBlow() {
  	    // Действия для удара
  	    System.out.println("The robot performs a deceptive strike");
}

public static void stepBack() {
  	    // Действия для шага назад
  	    System.out.println("The robot takes a step backwards");
}

public static void main(String[] args) {
    	stepForward();
    	if (isEnemyAttacked()) {
        		evasion();
    	} else {
  	    	deceptiveAttackBlow();
    	}
    	stepBack();
}

public static boolean isEnemyAttacked() {
    	// Метод проверяет, атакует ли враг. returns логическое meaning.
    	return true;
}
지금은 이 코드, 특히 void , return 등과 같은 일부 단어가 다소 명확하지 않을 수 있다는 점을 이해합니다 . 서두르지 말고 토마토를 던지세요. 이제 모든 것을 설명하겠습니다. "분할과 정복" 패러다임의 일반적인 아이디어는 당신에게 분명해야 합니다. 방법이 우리에게 도움이 될 것입니다. 메소드 선언의 일반적인 구조는 다음과 같습니다.
модификатор_доступа возвращаемое_meaning Name_метода(принимаемые_параметры) {
   	//Тело метода
}

접근 수정자

액세스 한정자는 public , private , package 등 여러 키워드입니다 . 이 단어는 방법의 범위를 나타냅니다. 간단하게 설명하겠습니다. 이 단어를 사용하면 당신은 다른 사람들과 맛있는 음식을 나누고 있는 것 같습니다. 맛있는 것이 당신의 방법입니다. 비공개 인 경우 다른 클래스와 메서드를 공유하지 않습니다. package 인 경우 패키지 내의 클래스와만 공유합니다(클래스는 특정 패키지로 수집되며 나중에 배우게 됩니다). 글쎄, 대중은 당신이 친절함 그 자체이며 전체 프로그램과 함께 맛있는 간식(방법)을 공유한다는 것을 보여줍니다. 이 같은. 몇 레벨을 지나면 이 단어의 역할을 훨씬 더 잘 이해하게 될 것입니다.

반환 값

위의 예를 보십시오. 부울 값을 반환하는 isEnemyAttacked 를 제외한 모든 메소드는 void 키워드 로 표시됩니다 . 메소드가 void 로 표시되면 아무것도 반환하지 않을 수 있습니다. 이 방법은 단순히 일련의 작업을 수행하는 것뿐입니다. 이제 main 메소드 에 주목하세요 . void를 반환하는 메서드는 메서드 본문에서 이와 같이 호출됩니다. 그러나 isEnemyAttacked 메소드는 if 문의 괄호 안에서 호출됩니다 . 부울 값을 반환한다는 사실 때문에 중간 변수를 사용하지 않고 직접 삽입할 수 있는 기회를 얻습니다. 값 반환은 return 키워드를 사용하여 발생합니다 . 메소드가 int 유형을 반환하는 경우 모든 표현식에서 메소드를 호출할 수 있습니다.
public static int getNumber() {
 	    return 5;
}

public static void main(String[] args) {
    	int result = 5 + 6 + getNumber();
    	System.out.println(result);
}
결론:
16
getNumber 메소드는 int 값을 반환하므로 표현식에서 이를 호출할 수 있습니다. 또한 이 메서드는 사용자가 직접 만든 유형을 포함하여 모든 유형을 반환할 수 있습니다. 메소드에 대한 반환 유형을 지정한 경우 무언가를 반환해야 합니다. 다음과 같이 작성할 수 없습니다.
public static int findMaxNumber(int a, int b) {
 	if(a>b) {
 	    return a;
 	}
}
컴파일러는 첫 번째 조건이 충족되면 무언가를 반환하지만 두 번째 조건이 충족되면 반환하지 않는다고 꾸짖습니다.

매개변수 전달

작업 중에 사용되는 메서드에 매개변수를 전달할 수 있습니다. 가장 원시적인 예는 두 숫자의 합입니다. 하지만 우리는 원시적이지 않죠? 아주 전형적인 또 다른 예를 들어보겠습니다. Chef() - cook 메소드가 있다고 가정해 보겠습니다 . 매개변수 블록의 이 메소드에 수프 재료를 전달할 수 있으며, 결과적으로 이 메소드는 수프를 우리에게 반환합니다. 이와 같이:
public static void main(String[] args) {
    	String[] ingredients;
    	// Инициализация массива ингредиентов
    	Soup soup = chef(ingredients);

}

public static Soup chef(String[] ingredients) {
    	Soup soup = new Soup();
    	// Процесс варки супа
    	return soup;
}
(미리 생성된 Soup 클래스 가 있다고 가정해 보겠습니다 .) 기본 메서드에서는 재료 배열을 만든 다음 "요리사에게 전달"합니다( 요리사 메서드에 전달 ). "요리사가 수프를 만듭니다"라고 말한 다음 이를 Soup 클래스 의 객체로 반환합니다 . 모든 것이 매우 간단합니다. 모든 매개변수, 기본 유형, 객체, 배열 등을 메서드에 전달할 수 있습니다.

참조 및 값으로 매개변수 전달

Java 프로그래밍 언어에서는 모든 매개변수가 해당 값으로 메소드에 전달됩니다. 그러나 이 메커니즘은 기본 유형과 객체에 따라 다릅니다. 기본 유형을 메소드에 전달하고 변경하면 기본 메소드에서는 변경되지 않습니다. 단순히 값의 복사본을 전달하면 원래 변수가 보존됩니다. 가장 간단한 예:
public static void main(String[] args) {
    	int x = 1;
    	System.out.println(x);
    	getNumber(x);
    	System.out.println(x);

	}

	public static void getNumber(int i) {
    	i = i + 100;
	}
결론:
열하나
그러나 객체의 경우 변경 사항이 원본 객체에 영향을 미칩니다.
public class Program
{
	public static void main(String[] args) {
    	WiseMan wiseMan = new WiseMan();
    	wiseMan.setIq(300);
    	System.out.println(wiseMan);
    	changeObject(wiseMan);
    	System.out.println(wiseMan);

	}

	public static void changeObject(WiseMan m) {
    	m.setIq(100);
	}
}

public class WiseMan {
	int iq;

	public void setIq(int iq) {
    	this.iq = iq;
	}

	public int getIq() {
    	return iq;
	}

	public String toString() {
    	return "Our wise man has an IQ "+iq;
	}
}
결론:
우리 현자에게는 IR 300이 있습니다. 우리 현자에게는 IR 100이 있습니다.
iq 속성을 가진 WiseMan 클래스가 있습니다 . 그리고 이 필드의 값을 제어하는 ​​두 가지 방법이 있습니다. 기본 메소드에서는 wiseMan 객체를 생성하고 iq 값을 300으로 설정합니다 . 그런 다음 iq 300의 현자를 changeObject 메소드에 전달하지만 이 메소드에서 그는 바보가 됩니다. iq 값을 100으로 설정합니다. 그런 다음 기본 메서드에서 개체를 인쇄합니다. ChangeObject 메소드에서 m 변수 의 다른 세이지(sage)를 조작하고 있음 을 알 수 있습니다 . 그러나 우리는 원래 객체를 수정하고 있습니다. 사실은 main 메소드에 있는 wiseMan 객체와 changeObject 메소드 에 있는 m 객체 가 동일한wiseman이고 객체에 대한 참조가 매개변수로 메소드에 복사된다는 것입니다. 개별 메서드에서 개체를 편집할 때 이 점을 염두에 두십시오.

마지막으로 정적 수정자에 대한 몇 마디

일반적으로 여기서는 몇 마디로 충분하지 않지만 시도해 보겠습니다. 이 수정자로 표시되지 않은 일반 메서드는 클래스 개체에 속합니다. 그리고 정적 메서드는 클래스 자체에 속합니다. 개별 개체에 일반 메서드를 사용할 수 있습니다. 위 예제의 WiseMan 클래스를 살펴보세요 . 모든 사람의 IQ 수준이 다르기 때문에 각 현자는 자신만의 getIqsetIq 메서드를 갖게 됩니다. 이 클래스에 정적 메소드 generateAWisePhrase를 추가하면 객체 없이 해당 메소드를 호출할 수 있습니다.
WiseMan.generateAWisePhrase();
일반적으로 static 에 대해 여러 강의를 작성할 수 있으므로 지금은 이 정보로 충분합니다 . 코드의 순서를 유지하기 위한 메서드를 작성할 때 몇 가지 규칙을 따르십시오.
  • 메소드가 수행하는 작업이 명확하도록 의미 있는 이름을 지정하십시오.
  • 매우 긴 메소드를 작성하지 마십시오. 최적의 길이는 8~15줄입니다.
  • 메소드 매개변수의 수는 4~5개를 초과할 수 없습니다.
  • 코드에 비슷한 기능이 두 번 있다면 생각해 보세요. 일반화하여 별도의 메서드에 넣는 것이 가치가 있을까요?
이러한 기술은 프로그램 성능을 향상시키는 데 도움이 되며, 가장 중요하게는 코드를 더 읽기 쉽게 만드는 데 도움이 됩니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION